繁体   English   中英

向量上的按位运算<bool>

[英]bitwise operations on vector<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,新版本以不同的方式存储内容,并且您的代码中断的原因并不明显。

这个也应该有效。

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM