6

重複の可能性:
32 ビット整数の設定ビット数をカウントする最適なアルゴリズムは?

2 つの数値を比較して 1 のビットの数を取得するプログラムを作成したいと考えています。任意の 2 つの数値のビットを比較して、1 と 0 の 2 進数が異なる場所を見つけます。つまり、排他的 OR (XOR) 関係です。

if 22 (10110 バイナリを持つ) のように、15 (01111 バイナリを持つ) と比較します。

最初のもの 10110

二つ目 01111

結果 11001

答えは 25 になりますが、私が取得したいのは、3 つの 1 と 0 が異なる 3 です。

4

3 に答える 3

6

うーん、頭に浮かぶ最初の非再帰的なアイデアは次のとおりです。

int a = ...;
int b = ...;
int x = a ^ b;

int count;

for (int i = 0; i < 32; ++i) {
    if (x & (1 << i)) {
        ++count;
    }
}
于 2012-03-31T09:29:11.227 に答える
2

std :: bitset :: countはあなたが探していることをするべきです:

http://www.cplusplus.com/reference/stl/bitset/count/

http://en.cppreference.com/w/cpp/utility/bitset/count

于 2012-03-31T09:29:43.520 に答える
0

これが最も簡単な方法です。

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

于 2012-03-31T09:32:01.963 に答える