按位操作会产生不正确的结果

我对位操作相当陌生,所以如果我的问题看起来措辞不佳或不适合使用stackoverflow,我会提前道歉。 最近,我一直在玩弄按位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("%Xn", 010 & 2); //prints out 0?!?!?
    printf("%Xn", 10 & 2); //prints out 2
    printf("%Xn", 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是否等于真? 任何建议表示赞赏。

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

编辑2 :现在看来,上面的if语句不工作时,我输入0b010到控制台。 但是, 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的八进制数
  • 1010的小数。
  • 011是9的八进制数。
  • 而且,虽然我们在... ...

  • 100100的小数。
  • 如果你想要二进制文件,你需要做不同的事情:

  • 一些编译器/标准接受二进制常量0b010
  • 否则,你需要转换为十进制,八进制(从0开始)或十六进制(从0x开始)

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

    链接地址: http://www.djcxy.com/p/75009.html

    上一篇: Bitwise operation gives incorrect result

    下一篇: Slow bitwise operations