c++ - 考虑长度的位操作过滤器

标签 c++ bit-manipulation

我需要编写一个获取 2 个字节和一个 bool 值的函数:

filter(int length, uint16_t* A, uint16_t* B, bool checkByZeros)

所需的逻辑是: length 是要检查的位数(即如果 length = 9 字节数组将包含 2 个字节) 如果 checkByZeros 为 False

函数将返回 true 如果:

all the bytes set (=1) in A are also set in B

例如(长度=9):

checkByZeros=True, A:000001111, B:000001111 ==> True
checkByZeros=True, A:000001111, B:000011111 ==> True
checkByZeros=True, A:000001111, B:000000111 ==> False

如果 checkByZeros 为 False

如果出现以下情况,该函数将返回 true: A 中所有未设置 (=0) 的字节在 B 中也未设置 例如:

checkByZeros=False, A:000001111, B:000001111 ==> True
checkByZeros=False, A:000001111, B:000011111 ==> False
checkByZeros=False, A:000001111, B:000000111 ==> True

如果我逐位遍历字节但我需要更快的位操作方法,则实现非常幼稚。 有什么建议么?我有点迷路了,因为当考虑不同的长度时,位操作应该忽略位于长度之后的位

最佳答案

您可以使用按位运算符同时检查多个位。例如,如果您想检查 a 的所有设置位有相应的设置位 b ,您可以编写以下内容:

(~b & a & mask) == 0

在这里~bb 的按位反转, 其中有 1在所有 b 的地方有0 s,所以,~b & a会有1在某个位置当且仅当a1在这个位置和b0 ,这正是我们所需要的。

面具是(1 << length) - 1 ,即包含 1length仅最低位,从而帮助我们忽略我们不想检查的结果的最高位。

此方法允许您一次最多检查 64 位(长度为 long long)。如果checkByZerostrue ,您可以编写类似的代码。

关于c++ - 考虑长度的位操作过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41159746/

相关文章:

c# - 在 C# 中存储长二进制文件(最多 512 位)的最佳方法

javascript - JavaScript 中处理位压缩的最有效方法

java - 位运算符的使用

c++ - 为什么在删除原子引用计数智能指针中的数据之前需要获取屏障?

c++ - 当我在 Linux 上使用 STL 编译 C++ 程序时,STL 库是如何链接的?

c++ - 动态创建 va_list

bit-manipulation - 1 左移 31 (1 << 31) 如何获得最大 int 值?这是我的想法和我在网上找到的一些解释

c++ - 什么是 0xFF,为什么要移位 24 次?

c++ - 在模板类中初始化类型为 'T &' 的静态成员的正确方法是什么?

c++ - boost::smart_ptr 和 COW 容器