计算数字中的位数

时间:2009-05-09 17:52:09

标签: c assembly bit-manipulation bitmask

重复:

  

Best algorithm to count the number of set bits in a 32-bit integer?


假设您有一个号码。有没有办法计算该数字的二进制表示中等于1的位,而不是使用迭代?我的意思是,有没有办法使用一些按位运算符和掩码在恒定时间内完成它。我需要的解决方案适用于32位和64位架构。啊差点忘了,我需要它用于C语言或汇编程序也很好。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

嗯,当然有,但你不会喜欢它。

当然,您可以构建一个包含所有正确值的查找表:

表[1] = 1,表[2] = 1,表[3] = 2等。

所以,这会给你一个非常快的答案,但它本身就是一个完全没用的解决方案,因为这个表必须非常非常大。

您可以稍微优化一下,但只需要一点点迭代。只需创建一个8位版本的表解决方案,一个仅仅256个条目的表,然后迭代要检查的值中的每个BYTE,总结表查找的结果。类似的东西:

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

答案 2 :(得分:1)

是的,您可以使用look up table

来实现