向量<bool>上的按位运算

vector<bool>上执行按位运算的最佳方法是什么?

据我了解, vector<bool>是一种专门化,每布尔值使用一个位。 为了节省内存的原因,我选择了vector<bool> 。 我知道vector<bool>存在一些问题,但为了我的需要,它是合适的。

现在 - 对整个这种向量应用按位运算的最高性能方式是什么?

如果我在for循环中读取并读出每个单独的bool并将其存储回来,那么我会了解更多操作,以便访问实际值。

谢谢!


如果在编译时固定位数,那么使用std::bitset会更好

如果不是,(即位数在运行时变化),那么你应该看到并且可以使用boost::dynamic_bitset

在这两种情况下,执行所有按位操作都非常容易。


忽略问题的标题,我们可以回答这个问题,而是:

在矢量上执行按位运算的最佳方法是什么?

最好的方法是将你的向量定义为vector<unsigned char> (或vector<uint32_t>或任何其他你选择的整数类型),然后按照通常的方式对无符号整数数组进行按位操作。 事情会以这种方式快得多,并且不会有隐藏的机制。

你可以使用除法(或者按位运算符,如果你是光滑的)来解析你需要操作的数组索引,并且for循环可以应用大于单个元素的按位运算。

这里有一个相关的问题:在C中传输很多位

如果您决定使用您自己的操作符来包装vector<unsigned some-int-type> ,则基本上会执行相同的操作。


我读了这两个答案,但只是想要一个快速解决方案,并实施了一些可怕的事情。

您可以让位运算符在vector<bool> ,但代码必须专门用于c ++标准库实现或回退到慢速表单。 这是我的operator| 对于GNU libstdc ++ - v3:

std::vector<bool> operator|(std::vector<bool> A, const std::vector<bool>& B)
{
    if (A.size() != B.size())
        throw std::invalid_argument("differently sized bitwise operands");

    std::vector<bool>::iterator itA = A.begin();
    std::vector<bool>::const_iterator itB = B.begin();

    // c++ implementation-specific
    while (itA < A.end())
        *(itA._M_p ++) |= *(itB._M_p ++); // word-at-a-time bitwise operation

    return A;
}

这当然很糟糕。 有人更新GCC,新版本存储不同的东西,你的代码没有明显的原因中断。

链接地址: http://www.djcxy.com/p/75003.html

上一篇: bitwise operations on vector<bool>

下一篇: Using bitwise operators for Booleans in C++