Best algorithm to count the number of set bits in a 32-bit integer?
假设您有一个号码。有没有办法计算该数字的二进制表示中等于1的位,而不是使用迭代?我的意思是,有没有办法使用一些按位运算符和掩码在恒定时间内完成它。我需要的解决方案适用于32位和64位架构。啊差点忘了,我需要它用于C语言或汇编程序也很好。
答案 0 :(得分:3)
在http://graphics.stanford.edu/~seander/bithacks.html处没有循环的位计数算法。 http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
的大量位计算算法答案 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。
来实现