按位AND的结果似乎为0,但不是

时间:2019-02-04 19:34:47

标签: c bit-manipulation

我遇到以下情况:

#include <stdio.h>

int main(void) {
  int first = 0x08;

  printf("%d\n", first & 0b10);
  printf("%d\n", first & 0b10 == 0);

  if (first & 0b10 == 0) {
    printf("SET");
  } else {
    printf("NOT");
  }

  return 0;
}

打印出两个0,然后打印NOT。这是怎么回事first & 0b01似乎为零,因此应通过条件。

3 个答案:

答案 0 :(得分:3)

这是运算符优先级的问题。

按位AND运算符&的优先级低于相等运算符==的优先级。所以这个:

first & 0b10 == 0

与:

first & (0b10 == 0)

这不是您想要的。它将0b10的相等性与0进行比较,这是错误的。然后计算first & 0为0。

添加括号以获得所需的行为:

(first & 0b10) == 0

答案 1 :(得分:2)

这称为operator precedence

first & 0b10 == 0

首次评估:

0b10 == 0  // which is false ==> 0

然后

first & 0  // which is also 0

要获得预期结果,请使用括号来强制求值顺序:

(first & 0b10) == 0  // this will true ==> 1

答案 2 :(得分:1)

因为==的优先级高于&。

这里是参考:Operator Precedence