c++逻辑与运算符

C++ Logical AND Operator

本文关键字:运算符 c++      更新时间:2023-10-16

我试图使用逻辑与运算符,但我得到一些意想不到的行为。

#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,则二进制表示为0110…没有共同点!结果当然是0。

您需要使用的是按位a | b表示"返回 a b中设置的所有位。

如果a为1,b为2,则二进制表示为0110,因此结果为11或您期望的3。

将这些操作理解为集合操作"交集"answers"并集",而不是二元操作""answers"",可能会有所帮助。

您混淆了|&。您期望的结果对应于以下迭代:

 flags |= (1 << i);

|=中的按位或将"添加"位到您的bitset flags中,而按位与只能删除位。