【发布时间】:2016-12-15 08:39:55
【问题描述】:
我需要编写一个获取 2 个字节和一个布尔值的函数:
filter(int length, uint16_t* A, uint16_t* B, bool checkByZeros)
需要的逻辑是:
length 是要检查的 bits 的数量(即,如果 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
如果我逐位循环遍历字节,那么实现是相当幼稚的,但我需要更快的位操作方法。 有什么建议么?我有点迷茫,因为在考虑不同的长度时,位操作应该忽略位于长度之后的位
【问题讨论】:
-
您是在
c还是c++编码?这些是不同的语言,都没有内置类型byte -
@alexeykuzmin0 我在 c++ 上,目前我使用 uint16_t 而不是 byte[],所以长度最大值为 16,但很快我将更改实现以使用 uint8_t *array 无论如何,AFAIK 位操作可以在任何类型上完成
-
你对the bitwise operators了解多少?似乎对于第一种情况(
checkByZeros == true),简单的屏蔽和相等比较就足够了(A & B == A)。第二种情况也可以使用相同的方法(在按位补码运算符的帮助下)。 -
请再次检查您的问题;您对
checkByZeros的使用在整个帖子中不一致,例如,"if checkByZeros isFalse" 使用了两次。
标签: c++ bit-manipulation