C ++逻辑AND运算符

时间:2014-05-19 17:30:42

标签: 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;
}

实际输出:

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;即可获得预期的输出。在我的程序中使用+。但是我想知道我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

这是bitwise的一个常见错误,...人们假设a & b表示&#34;返回a的所有位以及b的所有位...它没有。这意味着&#34;返回 a b&#34;中设置的位。

如果a为1,b为2,则二进制表示为0110 ...没有共同位!结果当然是0。

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

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

将这些操作视为设置操作&#34; 交叉点&#34;可能会有所帮助。和&#34; union &#34;而不是二进制操作&#34; &#34;和&#34; &#34;。

答案 1 :(得分:2)

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

 flags |= (1 << i);

|=中的按位OR将&#34;添加&#34;比特集flags的位,而按位AND只能删除位。