c - C 中的位旋转 - 计算位

标签 c bit-manipulation bitcount

我想计算在一个非常大的位 vector (即 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]). 

我突然想到,如果我改用 short int 指针(即 short int * sPtr),那么我只需要一半的查找次数,但有一个 65534 元素的查找表,它将有它的自己的内存使用成本。

我想知道每次检查的最佳位数是多少。此外,如果该数字不是某些预设类型的大小,我如何沿着我的位 vector 向下移动并将指针设置为 ANY 超过位数组起始位置的任意位数。

我知道还有其他计算位的方法,但现在我想确定我可以在与其他方法进行比较之前优化此方法。

最佳答案

您可以使用按位运算对其进行计数:

char c = cPtr[x];
int num = ((c & 0x01) >> 0) +
          ((c & 0x02) >> 1) +
          ((c & 0x04) >> 2) +
          ((c & 0x08) >> 3) +
          ((c & 0x10) >> 4) +
          ((c & 0x20) >> 5) +
          ((c & 0x40) >> 6) +
          ((c & 0x80) >> 7);

它可能看起来有点长,但它不需要多次访问内存,所以对我来说毕竟它看起来很便宜

您甚至可以通过每次读取一个 int 来降低成本,但是您可能需要解决对齐问题。

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

相关文章:

mysql - 如何在Sybase SQL Anywhere 中模拟MySQL 的bit_count 函数?

c++ - 在 C 或 C++ 中使用分布生成数字

c - 如何在C中模拟一个4位二进制加法器

java - 移植C代码;需要有关按位运算和指针语法的帮助

mysql - 在 mysql 中执行按位异或 + bit_count 时遇到问题

chess - 一个字节的尾随/前导零计数

python - 在 Python 中使用 C 函数

c - xtaskcreat如何在FREERTOS中创建没有函数体的任务

c - 在双缓冲区交换期间处理 UART ISR

algorithm - 使用无限内存的 K&R 方法计算位数