重複の可能性:
32 ビット整数で設定されたビット数をカウントする方法は?
unsigned char 型の値を指定し、その中の合計ビット数を数えます。最速の方法は何ですか? 私は以下のように 3 つの関数を書きました。最善の方法は何ですか?また、誰かがより高速な関数を思い付くことができますか?(私は非常に高速な関数が欲しいだけです)
const int tbl[] =
{
#define B2(n) n, n+1, n+1, n+2
#define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
B6(0), B6(1), B6(1), B6(2)
};
char naivecount (unsigned char val)
{
char cnt = 0;
while (val)
{
cnt += (val & 1);
val = val >> 1;
}
return cnt;
}
inline tableLookUp(int val)
{
assert(val >= 0 && val <= 255);
return tbl[val];
}
int asmCount(int val)
{
int res = 0;
asm volatile("xor %0, %0\n\t"
"begin:\n\t"
"cmp $0x0, %1\n\t"
"jle end\n\t"
"movl %1, %%ecx\n\t"
"and $0x1, %%ecx\n\t"
"addl %%ecx, %0\n\t"
"shrl %1\n\t"
"jmp begin\n\t"
"end:"
: "=r"(res)
: "r" (val));
return res;
}
編集:
私はすべての方法をテストしましたが、最速の方法は命令を使用すること popcntl
です.命令のないプラットフォームでは、テーブルルックアップを使用します.