带有条件的逻辑与运算符

Logical AND operator with a condition

本文关键字:运算符 有条件      更新时间:2023-10-16

给定一个阈值T和一组位图,我想创建一个结果位图"br",使得"br"的第I位只有在>=T位图中第I位被设置为1时才被设置为1。

我将用一个例子来说明我的问题:让我们假设我们有4个位图(长度相等)并且T=3:
b1 (10000)
b2 (01110)
b3 (10110)
b4 (00010)

然后我的结果位图br =(00010) -因为只有第4位被设置为1>=3位图。如果T=2,则br =(10110)。

一种简单的方法是遍历每个位图,并保留一个向量,该向量存储第i个索引中"i"位的计数。之后,可以迭代这个"count"向量。

另一种方法(我认为)是实现一个修改后的逻辑与运算符,这样,在得到的位图中,如果第I位在>=T位置上被设置为1,则第I位被设置为1。

还有其他有效的方法吗?我使用c++和EWAHBoolArray (https://github.com/lemire/EWAHBoolArray)库。目前,它们不具备在多个位图之间进行AND操作的能力。任何回应都非常感谢!

您可以通过一些操作和添加来完成此操作。你实际上是在试图得到单个比特的和。为了在普通加法中做到这一点,你需要为每一列的最大和腾出空间。你可以通过将每个值分成3个部分来实现。然后你添加一个常数,确保你想要的和设置上位,然后你可以屏蔽掉它。

b1a = b1 & 0b01001;
b1b = (b1 >> 1) & 0b01001;
b1c = (b1 >> 2) & 0b01001;
b2a = b2 & 0b01001;
...
bra = ((b1a + b2a + b3a + b4a + 0b01001) & 0b100100) >> 2;
brb = ((b1b + b2b + b3b + b4b + 0b01001) & 0b100100) >> 1;
brc = ((b1c + b2c + b3c + b4c + 0b01001) & 0b100100);
br = bra | brb | brc;