繁体   English   中英

std::vector 的 SINGLE BIT 上的按位运算<bool> . 为什么会出错?

[英]Bitwise operations on SINGLE BIT of std::vector<bool>. Why the error?

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

为了使这些工作,我基本上需要对源位组中的一定数量的位进行异或(例如, 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)]
   }
}

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

没有可行的重载 ^=

为了能够做这些事情,我能做什么?

std::vector<bool>在最好的情况下是混乱的,在最坏的情况下是令人憎恶的。 它的operator[]不返回bool&而是返回一个代理对象( 见这里)。 此代理没有重载或所有可能的按位运算,因此您必须使用 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如果他们都没有通过。

std::vector<bool>是一个特殊的容器。 它就像一个std::vector<int> ,但标准允许std::vector<bool>将其元素打包成单个位,这意味着当您使用operator[]时它返回一个代理对象 该对象没有operator ^=的重载,因此您无法使用它。 您可以做的是写出^=的长形式,例如

out[i] = out[i] ^ in[foo(i)]

std::vector<bool>::operator[]返回一个代理类。 您可以查看有关cppreference的文档。

您可以使用static_cast<bool>来获取实际的 bool 值并在 XOR 中使用它。

out[i] = static_cast<bool>(out[i]) ^ in[foo(i)];

编辑:或者正如 Max 所指出的那样,只需重写它就会进行隐式转换,因此强制转换是多余的。

out[i] = out[i] ^ in[foo(i)];

暂无
暂无

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

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