【发布时间】:2012-03-05 21:18:01
【问题描述】:
我想计算一个非常大的位向量(即 100,000 位)中设置的位。
我目前正在做的是使用指向 char 的指针(即 char *cPtr)来指向位数组的开头。我然后:
1. look at each element of the array (i.e. cPtr[x]),
2. convert it to an integer (i.e. (int) cPtr[x])
3. use a 256 element look-up table to see how many bits are set in the given byte (i.e. cPtr[x]).
我突然想到,如果我使用一个短整型指针(即短整型 * sPtr),那么我只需要一半的查找次数,但使用一个 65534 元素的查找表,它将有它的自己的内存使用成本。
我想知道每次检查的最佳位数是多少。此外,如果该数字不是某些预设类型的大小,我如何才能遍历我的位向量并将指针设置为 ANY 位数组起始位置之后的任意位数。
我知道还有其他方法可以计算位数,但现在我想确定我可以在与其他方法进行比较之前优化此方法。
【问题讨论】:
-
这个网站可能值得一看:graphics.stanford.edu/~seander/bithacks.html
-
测试是找出特定机器性能的唯一方法。您几乎肯定会发现 8 的倍数对您来说是最有效的,因为移位的开销很大,而且由于缓存局部性,可能正好是 8 位。
标签: c bit-manipulation bitcount