c++ - 计算字节数组中的零 b 位子序列

标签 c++ bit-manipulation

我正在寻找计算 uint8_tb 位子序列(非重叠) 数量的最快方法> 任意大小的数组 S(虽然 S 通常很小)。

约束:

  • b 总是2的幂,有效值实际上只有:1、2、4、8、16和32
  • 假定 uint8_t 中的位数为 8,并且 S * 8 可被 b
  • 整除

例子:

  • b = 4, array = 0xA0 0x39 0x04 0x30- 正确答案是 3
  • b = 1, array = 0xFF 0x1F 0xF8 - 正确答案是 6
  • b = 16, array = 0x05 0x16 0x32 0x00 - 正确答案是 0

我目前正在做的是将位“解压缩”为字节,然后使用零缓冲区 memcmp 子序列,但在我看来应该有一种更快的方法来执行此操作。

最佳答案

您可以使用与检测字符串中的空字节的众所周知方法类似的位旋转。例如对于 b=4,您可以读取一个 32 位字 x 并执行

__builtin_popcount((x - 0x11111111) & (~x & 0x88888888))

此处,x - 0x11111111 生成一个值,其中如果 4 位组为零或已设置,则每个 4 位组的高位为 1;第二部分丢弃那些已经设置的,然后你只需要计算剩余的位。

关于c++ - 计算字节数组中的零 b 位子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38139959/

相关文章:

c++ - Qt UI 测试 : How to simulate a click on a QMenuBar item using QTest?

c++ - bjam 运行时链接=静态

c - 添加 0xff 对按位运算的影响

c - C 中的按位运算符,int 021 vs 21?

c++ - 位运算符 C++

Java 表达式等价

c++ - 如何在 QWidget 子类之外调用 QMessageBox 静态 API

javascript - 有没有更有效的方法将数组从 C++ 返回到 javascript?

c++ - 如何将多个堆数组传递给新线程?

python - 检查二进制表示中是否存在位序列