実際にはいくつかのオプションがあります。
8ビット値のルックアップテーブルを使用して、符号なし整数値から4バイトすべてを並列に実行し、その結果を合計することができます。これもかなりパラレル化が可能です(マルチコアでもSSE3/4でも役立つかもしれません)。
また、ブライアン・カーニハンのソリューションで行くことができます。
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
v &= v - 1; // clear the least significant bit set
}
そして(モジュロ演算は本当に速いがあるだろうとして、64ビットマシン上で)私はいくつかの時間前にどこかで見つかった最後の可能な方法は次のとおりです。
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
c = ((v & 0xfff) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += (((v & 0xfff000) >> 12) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += ((v >> 24) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;