【问题标题】:C++ Logical AND OperatorC++ 逻辑与运算符
【发布时间】:2014-07-07 18:26:29
【问题描述】:

我正在尝试使用逻辑 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;按位 而非逻辑“与”运算符。此外,根据您的预期输出,您似乎想要按位“”(|)。

标签: c++ operators bitwise-operators logical-operators


【解决方案1】:

这是一个常见的按位错误...人们认为a &amp; b 的意思是“返回a 的所有位与b 的所有位相结合...它没有。它的意思是“返回both a b"中设置的位。

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

你需要使用的是按位a | b 表示“返回在 either a b 中设置的所有位。

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

将这些操作视为集合操作“intersection”和“union”可能会有所帮助,而不是二元操作“and” >”和“”。

【讨论】:

    【解决方案2】:

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

     flags |= (1 << i);
    

    |= 中的位或将“添加”位到您的位集flags,而位与只能删除位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2018-09-26
      相关资源
      最近更新 更多