【问题标题】:Bit operation filter with length consideration考虑长度的位操作过滤器
【发布时间】: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 is False" 使用了两次。

标签: c++ bit-manipulation


【解决方案1】:

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

(~b & a & mask) == 0

这里的~bb 的按位反转,它在b 具有0s 的所有地方都有1s,因此,~b & a 将在某个位置有1,如果并且只有a 在这个位置有1 并且b0,这正是我们需要的。

掩码是(1 << length) - 1,也就是说,1 只包含在length 的最低位中,因此可以帮助我们忽略我们不想检查的结果的最高位。

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

【讨论】:

  • 检查零=真的情况下的代码是什么?不加 ~b??
  • b & ~a & mask,逻辑和第一种情况完全一样
【解决方案2】:
uint16_t temp;

if(checkByZeroes)
{
    temp = *B | *A; // ignore 0's in B which are not in a
}
else
{
    temp = *B & *A; // ignore 1's in B which are not in a
}

return temp == *A;

【讨论】:

  • 长度呢?
  • 我提供了这个假设长度左侧的位将始终为零。如果是这种情况,这些位不会影响结果。否则,你需要一个面具,就像 alexskuzmin0 说的那样。
  • 我希望我能支持你@t.m.
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2012-06-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多