在vector<bool>
上执行按位操作的最佳方法是什么?
据我所知,vector<bool>
是一个每布尔使用一位的特化。出于节省内存的原因,我选择了vector<bool>
。我知道vector<bool>
存在一些问题,但根据我的需要,这是合适的。
现在 - 对整个这样的向量进行逐位运算的最高效的方法是什么?
如果我在for循环中读取并读出每个bool并将其存储回来,我理解它的方式会在内部执行更多操作以访问实际值。
谢谢!
答案 0 :(得分:9)
如果在编译时固定位数,那么使用std::bitset
如果没有,(即比特数在运行时变化),那么你应该看到并可以使用boost::dynamic_bitset
)
在这两个方面,完成所有按位操作非常容易。
答案 1 :(得分:4)
忽略问题的标题,让我们回答此问题,而不是:
在向量上执行按位运算的最佳方法是什么?
最好的方法是将矢量定义为vector<unsigned char>
(或vector<uint32_t>
,或者您选择的其他整数类型),并按顺序执行通常对无符号整数数组的操作。这样的事情会快得多,并且没有隐藏的机制。
你可以使用除法(或位运算符,如果你是光滑的)来解决你需要操作的数组索引,并使用for循环来应用大于单个元素的按位运算。
这是一个相关的问题: Bit twiddling a lot of bits in C
如果您决定使用自己的运算符包装vector<unsigned some-int-type>
,您基本上会执行相同的操作。
答案 2 :(得分:3)
我读了这两个答案,但只想快速解决,并实施了一些可怕的事情。
您可以使按位运算符在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,新版本以不同方式存储内容,并且您的代码没有明显原因中断。
答案 3 :(得分:-1)
This one也应该有效。
std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(),
v2.begin(), v3.begin(), std::logical_and<bool>());