Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;逻辑与运算符_C++_Operators_Bitwise Operators_Logical Operators - Fatal编程技术网

C++ C++;逻辑与运算符

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

我试图使用逻辑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);