计数数字中的位

重复:

计算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


是的,你可以通过使用查找表来做到这一点。

链接地址: http://www.djcxy.com/p/72585.html

上一篇: Count bits in the number

下一篇: Count the number of set bits in an integer