C++ C++;逻辑与运算符
我试图使用逻辑AND运算符,但得到一些意外行为C++ C++;逻辑与运算符,c++,operators,bitwise-operators,logical-operators,C++,Operators,Bitwise Operators,Logical Operators,我试图使用逻辑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 << "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 = 1
Anding with 2
flags = 3
Anding with 4
flags = 7
请注意,只需在程序中用+替换&即可获得预期的输出。但我想知道我做错了什么?你把
和&
搞混了。您的预期结果对应于以下各项的迭代:
flags |= (1 << i);
flags |=(1这是按位排列的常见错误,…人们认为a&b
意味着“返回a
的所有位与b
的所有位组合”…它不返回。它意味着“返回a
和b
中设置的位”
如果a是1,b是2,二进制表示是01
和10
…没有共同的位!结果当然是0
您需要使用的是按位或。a | b
表示“返回在a
或b
中设置的所有位”
如果a为1,b为2,则二进制表示形式为01
和10
,因此结果为11
或预期的3
将这些操作视为集合操作“交集”和“并集”,而不是二进制操作“和”和“或”。&
是按位的,而不是逻辑的“和”运算符。此外,根据预期的输出,您似乎想要按位的“或”(
)。
flags |= (1 << i);