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

我认为, vector<bool> 是每个布尔值使用一位的专业化。我选择了 vector<bool> 出于节省内存的原因。我知道存在一些问题 vector<bool> 但对于我的需要来说这是合适的。

现在 - 将按位运算应用于整个此类向量的最高效的方法是什么?

如果我在 for 循环中执行此操作并读出每个布尔值并将其存储回来,按照我的理解,会在内部执行更多操作以访问实际值。

谢谢!

有帮助吗?

解决方案

如果位数在编译时是固定的,那么最好使用 std::bitset

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

在这两种情况下,完成所有按位运算都非常容易。

其他提示

忽略你的问题的标题,让答案的这个的问题,而不是:

  

什么是对向量执行按位运算的最佳方式?

最好的方法是定义你的载体为vector<unsigned char>(或vector<uint32_t>,或任何其他整数类型选择),并做你的位操作如何你通常会无符号整数数组。事情会快得多这种方式,并且不会有隐藏的机制。

您可以使用部门(或按位运算符,如果你是光滑)来解决数组索引,你需要针对其工作,并for循环运用位操作比单个元件大。

下面是一个相关的问题: 位操作用C 很多比特的

您基本上可以做这些相同的操作,如果当你决定换vector<unsigned some-int-type>用自己的运营商。

我看这两种回答,只是想要一个快速的解决方案,并实现了一些可怕的事情。

您可以使位运算符vector<bool>工作,但代码必须专门用于C ++标准库的实现或回落到缓慢的形式。这是我对GNU的libstdc ++ operator| - 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更新,新版本存储不同的事情,和你的代码休息没有明显的原因。

这一个应太

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top