我不确定类似这样的东西应该叫什么名字(因此标题有些拙劣),但我需要这样的东西来完成我的项目。我用言语无法很好地描述它,但我希望这个图示可以为我解释:
在这个例子中,当忽略任意“索引”(例如5)后的所有内容时,“on-bits”的数量(即“3”)最快的方式是什么?
在这个例子中,当忽略任意“索引”(例如5)后的所有内容时,“on-bits”的数量(即“3”)最快的方式是什么?
对于msvc,它是__popcnt(和变体),对于gcc,它是__builtin_popcount(和变体),对于OpenCL(好吧,您没有要求,但为什么不加入呢?)它是popcnt,但必须启用cl_amd_popcnt。
#ifdef
块中并与我编写的内容进行比较。谢谢! - Anne Quinn首先做 input &= 0xfffffff8
(或者根据您的输入类型选择相应的等价方法)以清除最右边的三位。然后从这里任选一种方法。
以下是类似的内容:
int
countOnes( unsigned value, int top )
{
assert( top >= 0 && opt < CHAR_BIT * sizeof( unsigned ) );
value &= ~(~0 << top);
int results = 0;
while ( value != 0 ) {
++ results;
value &= value - 1;
}
return results;
}
i & (i - 1)
会重置低位的比特位。查找表可以在常数时间内提供这些信息。
int
这样的类型,它变得有点笨重。(而且你仍然需要掩码来修剪顶部不需要的位。) - James Kanze