带有条件的逻辑与运算符
Logical AND operator with a condition
给定一个阈值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;
相关文章:
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 如何使用 soong 命名空间来有条件地编译模块
- 重载运算符有地址吗?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 这里的 = 运算符有什么用法?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 如何在Visual Studio 2019中有条件地编译c++源文件
- 无法使用三元运算符有条件地分配"istream &"?
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 根据数值模板参数有条件地编译转换运算符
- 有条件地启用运算符重载
- + 由于有条件,运算符不起作用
- 在有条件的情况下使用短路运算符是否合法
- 如何使用enable_if有条件地定义<<运算符