質問

重複:

  

ベストアルゴリズムは、32ビットの整数に設定されたビットの数をカウントするか

<時間>

あなたは数を持っていると仮定します。反復を使用していない、その数のバイナリ表現で1に等しいビットをカウントする方法はありますか?私が意味する、いくつかのビット単位の演算子とマスクを使用して、一定の時間でそれを行うにはどのような方法があります。私は、アーキテクチャ32ビットと64ビットの両方のために働くだろうソリューションを必要としています。ほとんど忘れてしまったああ、私はC言語やアセンブラのためにそれを必要とすることも良いです。

役に立ちましたか?

他のヒント

まあ、もちろんありますが、あなたはそれを好きつもりはない。

あなたは、もちろん、その中のすべての正しい値を持つルックアップテーブルを構築することができます:

表[1] = 1、表[2] = 1、表[3] = 2、など。

だから、これはあなたの本当に速いの答えを与えるだろうが、テーブルは非常に、非常に大規模でなければならないであろうことから、それは、それ自体で完全に役に立たないソリューションです。

あなたはこれを少し最適化することができますが、それはほんの少しの繰り返しが必要です。単にテーブルルックアップの結果を合計し、チェックする価値の各バイトを反復処理、その後、テーブル液、単なる256エントリテーブルの8ビット・バージョンを作成します。ような何かます:

short int tableLookup[256] = { 0, 1, 1, 2, 1, ... };
unsigned int valueToCheck = 89392491;
int result = 0;
while ( valueToCheck != 0 ) {
   result += tableLookup[ (valueToCheck & 0xFF) ];
   valueToCheck >>= 8;
}
// result should now have the correct bit count, if the table is correct.

うーん、これはよく知られているようだ(そしてここで私は私の頭の上にこれをオフにしていました)。 http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top