ホームに戻る
ビット探索

// ビットのカウント
__builtin_popcount(n)

// ビットは評価の順番でミスをすることが多い
// if(((b >> i) & 1) == 1)
// のように () をこまめにつけたほうが良い

for(int b = 0; b < (1 << n); b++){
  for(int i = 0; i < n; i++){
    if(((b >> i) & 1) == 1){
      
    }
    else{
      
    }
  }
}

// ビットを小さいほうから探索
// 0000→1000→0100→0010→0001→1100→・・・→0111
int n = 4;

for(int i = 0; i < n; i++){
  vector<int> v;
  for(int j = 0; j < (n-i); j++){
    v.pb(0);
  }
  for(int j = 0; j < i; j++){
    v.pb(1);
  }
  do{
    int b = 0;
    for(int j = 0; j < n; j++){
      b |= (v[j]<<j);
    }
    cout << b << endl;
  }while(next_permutation(all(v)));
}

// ビットの部分集合列挙
// 例えば mask = 110 のとき {110,100,10,(0)} を列挙できる。
// 初期値は mask であること。

// i==0 を評価しない
for(int i = mask; i > 0; i=(i-1)&mask){
}
// i==0 を評価する
for(int i = mask; i >= 0; i--){
  i &= mask;
  // ここに処理を書く
}

// mask を含む集合の列挙
// 例えば n = 3, mask = 110 のとき {110,111} を列挙できる。

for(int i = mask; i < (1<<n); i = (i+1)|mask){
}
inserted by FC2 system