按位运算给出不正确的结果

Bitwise operation gives incorrect result

我对按位运算还很陌生,所以如果我的问题措辞不当或不适合 Whosebug,我会提前道歉。最近,我一直在研究按位 AND 运算,只是简单地使用二进制之间的 & 符号打印出表达式的结果(在某些表达式中,我在二进制和小数之间使用按位 AND)。例如,我知道 110 & 4 等于 4 因为 110 & 4 等于 110 & 100

 1 1 0
 1 0 0
-------
 1 0 0

我在用 C 打印并将值输入按位运算计算器后得到了这个结果。但是,当出现这样的某些方程式时,我会感到困惑,

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("%X\n", 010 & 2); //prints out 0?!?!?
    printf("%X\n", 10 & 2); //prints out 2
    printf("%X\n", 011 & 010); //prints out 8?!?!?
    return 0;
}

我不确定为什么 main 的第一行打印出 0,因为我的理解是 01010 是相同的二进制文件(如果我错了请纠正我错误)和 010 & 010 应该等于 010 等于 2。最后最后的输出完全让我措手不及,因为我期望它打印出来的是,

 0 1 1
 0 1 0
-------
 0 1 0

然而,实际输出是8。

最后,我有一个关于这些按位运算如何变成布尔值的快速问题。例如,我见过编码人员将这些表达式用作 if 语句中的条件,例如

int byte;
scanf("%d",&byte);
if(byte & 2){
.....
}

只要结果不为0,byte & 2就等于真吗?任何建议表示赞赏。

编辑:我明白为什么我的问题现在不清楚了,因为我忘了提及我正在使用的整数常量的类型。我的意图是使用二进制而不是八进制,所以对于这种混淆我深表歉意。

EDIT2:现在,当我在控制台中输入 0b010 时,上面的 if 语句似乎不起作用。但是,0b010 & 2 等于 2 那么可能是什么原因造成的呢?

int byte;
scanf("%d",&byte);
if(byte & 2){
    //doesn't work when I input 0b010
}
if(0b010 & 2){
    //statement gets executed here but not the above, why?
}

在 C:

  • 010 是八进制的 8
  • 10 是 10 的十进制。
  • 011 是 9 的八进制。

而且,当我们在做的时候...

  • 100 是 100 的十进制。

如果你想要二进制,你需要做一些不同的事情:

  • 一些 compilers/standards 接受 0b010 作为二进制常量。
  • 否则需要转换为十进制、八进制(从0开始)或十六进制(从0x开始)

第二部分的答案是按位运算符不会"turn into booleans"。例如,在 if 语句中,C 将任何零值或空值解释为假,将任何非零值解释为真。在非布尔上下文中,它们只是数字、指针等。