我想计算在一个非常大的位向量中设置的位(即100000位)。
我目前正在做的是使用指向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]).

我突然想到,如果我使用一个短的int指针(即short int*sPtr),那么我只需要一半的查找,但是需要一个65534元素的查找表,这将有自己的内存使用成本。
我想知道每次检查的最佳位数是多少。另外,如果该数字不是某个预设类型的大小,我如何才能沿着位向量向下走,并将指针设置为超过位数组起始位置的任意位数。
我知道还有其他方法来计算位,但现在我想确定在与其他方法进行比较之前我可以优化这个方法。

最佳答案

我想知道每次检查的最佳位数是多少
唯一的办法就是测试。一次查看this question for a discussion of the fastest way to count 32 bits
另外,如果这个数字不是某个预设类型的大小,我怎么能
向下移动我的位向量,并将指针设置为任意数字
超过位数组起始位置的位。
不能将指针设置为任意位。大多数机器都有字节寻址,有些只能寻址单词。
你可以用任意的一个位来构造一个单词,就像这样:

long wordAtBit(int32_t* array, size_t bit)
{
    size_t idx = bit>>5;
    long word = array[idx] >> (bit&31);
    return word | (array[idx+1] << (32 - (bit&31));
}

关于c - C中的位翻转-计数位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9574125/

10-16 11:31