我正在尝试使用逻辑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
请注意,我只需更换&amp; amp;即可获得预期的输出。在我的程序中使用+。但是我想知道我在这里做错了什么?
答案 0 :(得分:7)
这是bitwise的一个常见错误,...人们假设a & b
表示&#34;返回a
的所有位以及b
的所有位...它没有。这意味着&#34;返回 a
和 b
&#34;中设置的位。
如果a为1,b为2,则二进制表示为01
和10
...没有共同位!结果当然是0。
您需要使用的是按位或。 a | b
表示&#34;返回 a
或 b
中设置的所有位。
如果a为1,b为2,则二进制表示为01
和10
,因此结果为11
或您预期的3。
将这些操作视为设置操作&#34; 交叉点&#34;可能会有所帮助。和&#34; union &#34;而不是二进制操作&#34; 和&#34;和&#34; 或&#34;。
答案 1 :(得分:2)
您混淆了|
和&
。您的预期结果对应于迭代:
flags |= (1 << i);
|=
中的按位OR将&#34;添加&#34;比特集flags
的位,而按位AND只能删除位。