[英]C++ Logical AND Operator
我正在尝试使用逻辑AND运算符,但出现了一些意外行为。
#include <iostream>
using namespace std;
int main() {
unsigned flags = 0;
cout << "flags = " << flags << endl;
for(int i=0; i<3; ++i) {
flags &= (1 << i);
cout << "Anding with " << (1 << i) << endl;
cout << "flags = " << flags << endl;
}
return 0;
}
实际输出:
flags = 0
Anding with 1
flags = 0
Anding with 2
flags = 0
Anding with 4
flags = 0
预期产量:
flags = 0
Anding with 1
flags = 1
Anding with 2
flags = 3
Anding with 4
flags = 7
请注意,我可以通过在程序中简单地用&替换+来获得预期的输出。 但是我想知道我在这里做错了什么?
这是按位排列的常见错误,...人们认为a & b
意思是“将a
所有位与b
所有位组合在一起……不然。这意味着”返回在两个位中设置的位a
和 b
”。
如果a为1,b为2,则二进制表示形式为01
和10
...没有共同点! 结果当然是0。
您需要使用按位或 。 a | b
a | b
表示“返回了在任一组中的所有的位a
或 b
。
如果a为1,b为2,则二进制表示形式为01
和10
,因此结果为11
或期望的3。
将这些操作视为集合操作“ 交集 ”和“ 联合 ”,而不是二进制操作“ 和 ”和“ 或 ”,可能会有所帮助。
你混了|
和&
。 您的预期结果对应于以下迭代:
flags |= (1 << i);
|=
的按位OR将“添加”位到您的位集flags
,而按位AND只能删除位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.