c - 按位与的结果似乎为 0,但实际上不是

标签 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 为零,所以应该通过条件。

最佳答案

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

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

first & 0b10 == 0

等同于:

first & (0b10 == 0)

这不是你想要的。它比较 0b10 与 0 是否相等,0 为假。然后 first & 0 被计算为 0。

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

(first & 0b10) == 0

关于c - 按位与的结果似乎为 0,但实际上不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523134/

相关文章:

c - 如何在 C 中将不同大小的数字签名扩展到 16 位?

c - 返回 x,其中从位置 p 开始的 n 位设置为 y 的最右边 n 位,其他位保持不变

c - 在不使用字符串库函数的情况下替换 C 中的子字符串

c++:如何将 uint32 中的相关位放入 uint8?

c - 特殊字符读取错误 - 文件 I/0

c - 使用 pthread 函数的 strtol 上的段错误

c - C 中涉及常量的算术表达式类型

c - 将 4 字节值中的特定位提取到 C 中的新变量中

使用 switch 语句在 C 中创建一个简单的计算器

c - 预处理器 : Concatenate string to each argument in __VA_ARGS__