2 つの数値を比較して 1 のビットの数を取得するプログラムを作成したいと考えています。任意の 2 つの数値のビットを比較して、1 と 0 の 2 進数が異なる場所を見つけます。つまり、排他的 OR (XOR) 関係です。
if 22 (10110 バイナリを持つ) のように、15 (01111 バイナリを持つ) と比較します。
最初のもの 10110
二つ目 01111
結果 11001
答えは 25 になりますが、私が取得したいのは、3 つの 1 と 0 が異なる 3 です。
2 つの数値を比較して 1 のビットの数を取得するプログラムを作成したいと考えています。任意の 2 つの数値のビットを比較して、1 と 0 の 2 進数が異なる場所を見つけます。つまり、排他的 OR (XOR) 関係です。
if 22 (10110 バイナリを持つ) のように、15 (01111 バイナリを持つ) と比較します。
最初のもの 10110
二つ目 01111
結果 11001
答えは 25 になりますが、私が取得したいのは、3 つの 1 と 0 が異なる 3 です。
うーん、頭に浮かぶ最初の非再帰的なアイデアは次のとおりです。
int a = ...;
int b = ...;
int x = a ^ b;
int count;
for (int i = 0; i < 32; ++i) {
if (x & (1 << i)) {
++count;
}
}
std :: bitset :: countはあなたが探していることをするべきです:
これが最も簡単な方法です。
int count_bits(int a)
{
int mask;
int count = 0;
for (mask = 1; mask; mask <<= 1)
{
if (mask & a) ++count;
}
return count;
}
もっとファンシーなものが必要な場合は、こちらをご覧ください: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive