计数位数

重复:

计算32位整数中设置位数的最佳算法?


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

在http://graphics.stanford.edu/~seander/bithacks.html上有一个没有循环的位计数算法。 http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/上的大量计数算法

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

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

表[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

是的,您可以使用查找表来完成此操作 。