我想出了一套规则,将一组位转换为另一组。
为了使它们起作用,我基本上需要对源位集中的一定数量的位进行异或运算(例如result[i]=source[foo(i)]^source[bar(i)]
,其中对foo
和bar
进行了边界检查)。由于我希望能够更改集合的大小,因此我决定使用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/