数のビットをカウント[複製]
-
20-08-2019 - |
質問
重複:
<時間>
あなたは数を持っていると仮定します。反復を使用していない、その数のバイナリ表現で1に等しいビットをカウントする方法はありますか?私が意味する、いくつかのビット単位の演算子とマスクを使用して、一定の時間でそれを行うにはどのような方法があります。私は、アーキテクチャ32ビットと64ビットの両方のために働くだろうソリューションを必要としています。ほとんど忘れてしまったああ、私はC言語やアセンブラのためにそれを必要とすることも良いです。
解決
ビットカウントアルゴリズムは、 HTTPのループなしです。 EDU /〜seander / bithacks.html に。 //gurmeetsingh.wordpress: HTTPでのビットカウントアルゴリズムの多く.COM / 2008/8月5日/ファーストビット・カウント・ルーチン/ の
他のヒント
まあ、もちろんありますが、あなたはそれを好きつもりはない。
あなたは、もちろん、その中のすべての正しい値を持つルックアップテーブルを構築することができます:
表[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 >
はい、あなたはを使用してテーブルを検索することを行うことができますするます。