2012-03-31 2 views
3

に可能性の重複取得:
Best algorithm to count the number of set bits in a 32-bit integer?2つの2進数を比較して、切り抜いたビット

を私は2 numbers.ifを比較して1のビットの数を取得するためのプログラムを書きたいです任意の2つの数字 の間のビットを比較して、1と0のどこで2進数が異なるかを調べる。 つまり排他的論理和(XOR)の関係です。

最初の10110

二番目01111

結果(バイナリ01111を有する)15とそれを

ような場合、図22(10110バイナリを有する)と比較11001

と答えは25になりますが、私が得たいのは、3つの1と0が違う3つです。

+1

いくつかのCPUは、人口数のための特別なハードウェア命令を持っています。コンパイラがこれを知っていて、関連するコードを発行することができるかどうかを知ることは面白いでしょう。 –

+0

これは[ハミング距離](http://en.wikipedia.org/wiki/Hamming_Distance)と呼ばれます。 – Potatoswatter

+0

__builtin_popcount(22^15)= 3 –

答えて

2

Hrmmm、心に来る最初の非再帰的な考え方はある :

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

int count; 

for (int i = 0; i < 32; ++i) { 
    if (x & (1 << i)) { 
     ++count; 
    } 
} 
2

のstd ::ビットセット::回数あなたが探しているものを行う必要があります。

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

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

+1

+1。たいていのマイクロプロセッサーは専用の "population count"命令を持っているため、そうでなければ移植可能ではないため、ライブラリ関数を使用することが重要です。 'bitset'はXORと' unsigned long'との変換をサポートしています。 – Potatoswatter