c++ - std::vector <bool>的单比特上的按位运算。为什么会出错?

标签 c++ stl bit-manipulation bit

我想出了一套规则,将一组位转换为另一组。

为了使它们起作用,我基本上需要对源位集中的一定数量的位进行异或运算(例如result[i]=source[foo(i)]^source[bar(i)],其中对foobar进行了边界检查)。由于我希望能够更改集合的大小,因此我决定使用std::vector<bool>

因此,我最终得到:

int foo(int i);
int bar(int i);
void baz(std::vector<bool> in, std::vector<bool>& out){
   out.clear();
   for(int i=0;i<in.size();i++){
    if(foo(i)>0 && foo(i)<in.size())
      out[i]^=in[foo(i)]
    if(bar(i)>0 && bar(i)<in.size())
      out[i]^=in[bar(i)]
   }
}

但是,这给了我一个错误:

No viable overloaded ^=



为了能够做这些事情,我该怎么办?

最佳答案

最好的情况下std::vector<bool>凌乱,最坏的情况下可憎。它的operator[]不返回bool&,而是返回一个代理对象(see here)。此代理没有重载所有可能的按位运算,因此您必须使用ifs,其operator=(bool)flip()

编辑:我只是阅读您的代码,而不是您的描述,您想做什么。设置两位的异或根本没有问题:

out[i] = in[j] ^ in[k]; // Whatever the right indices are.

我认为您实际上想做的事情是:

bool tmp = false;
if(foo(i)>0 && foo(i)<in.size())
 tmp^=in[foo(i)];
if(bar(i)>0 && bar(i)<in.size())
 out[i]=tmp^in[bar(i)];

也就是说,如果您都想通过边界检查返回in[bar(i)]^in[foo(i)],则如果只有一个(在此由in[j]表示)通过边界检查,则返回j;如果没有一个通过边界检查,则返回false

关于c++ - std::vector <bool>的单比特上的按位运算。为什么会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756134/

相关文章:

c++ - 哪一个使用c++ STL容器或MFC容器?

c++ - 试图获取进程名称,但我得到的是十六进制而不是文本

c++ - C++ 中具有不止一种排序方法的 STL 容器

c++ - 构造函数和析构函数调用的顺序?

c++ - 我如何比较 std::map 的正文成员?

c - 这段c代码的作用是什么?

java - 将代码从 C# 转换为 Java - 位操作、Int64 到 long

c - Bitshift乘以任何数字

c++ - ld : duplicate symbols for architecture x86_64 when defining a global var in a header

c++ - tr1::bind 并通过引用传递,这种行为真的是预期的吗?