ホームに戻る
ビット探索
// ビットのカウント
__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){
}