向量的按位运算<bool>
-
27-09-2019 - |
题
执行按位运算的最佳方法是什么 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>());