C++逻辑AND运算符

Kev*_*val 0 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 << "Anding with " << (1 << i) << endl;
    cout << "flags = " << flags << endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

实际产量:

flags = 0
Anding with 1
flags = 0
Anding with 2
flags = 0
Anding with 4
flags = 0
Run Code Online (Sandbox Code Playgroud)

预期产量:

flags = 0
Anding with 1
flags = 1
Anding with 2
flags = 3
Anding with 4
flags = 7
Run Code Online (Sandbox Code Playgroud)

请注意,我只需在程序中替换&,即可得到预期的输出.但是我想知道我在这里做错了什么?

Roo*_*ook 8

这是一个常见的错误,按位和...人们假设a & b意味着"返回与...的所有位相a结合的所有位b...它不会.它意味着"返回在两者 中设置的位a b ".

如果a为1,且b为2,则二进制表示为...... 01并且10没有共同的位!结果当然是0.

您需要使用的是按位.a | b意思是"返回在设定的所有位两种 a b.

如果a为1,且b为2,则二进制表示为0110,因此结果为11或预期的3.

将这些操作视为设置操作" 交集 "和" 联合 ",而不是二进制操作" "和" " 可能有所帮助.