按位运算会得出错误的结果

时间:2016-07-12 16:33:23

标签: c bit-manipulation bitwise-operators bit bitwise-and

我对按位操作相当新,所以如果我的问题措辞不合适或者不适合stackoverflow,我会提前道歉。最近,我只是通过在二进制文件之间使用&符号打印出表达式的结果来使用按位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是相同的二进制文件(请注意我,如果我&#39 ;错误)和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?
}

1 个答案:

答案 0 :(得分:3)

在C:

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

而且,虽然我们正在......

  • 100是100的十进制数。

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

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

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