我需要编写一个获取 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
在这里~b
是 b
的按位反转, 其中有 1
在所有 b
的地方有0
s,所以,~b & a
会有1
在某个位置当且仅当a
有1
在这个位置和b
有0
,这正是我们所需要的。
面具是(1 << length) - 1
,即包含 1
在length
仅最低位,从而帮助我们忽略我们不想检查的结果的最高位。
此方法允许您一次最多检查 64 位(长度为 long long
)。如果checkByZeros
是true
,您可以编写类似的代码。
关于c++ - 考虑长度的位操作过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41159746/