按位与的结果似乎是0,而不是

问题描述 投票:0回答:3

我有以下情况:

#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;
}

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

c bit-manipulation
3个回答
3
投票

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

按位与运算&比相等运算==优先级低。所以这:

first & 0b10 == 0

是相同的:

first & (0b10 == 0)

这是不是你想要的。它比较0b10与0平等的,这是假的。然后first & 0被评估其是0。

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

(first & 0b10) == 0

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

1
投票

因为==比和更高的优先级。

下面是引用:Operator Precedence

© www.soinside.com 2019 - 2024. All rights reserved.