我对按位操作相当新,所以如果我的问题措辞不合适或者不适合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,因为我理解010
和10
是相同的二进制文件(请注意我,如果我&#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?
}
答案 0 :(得分:3)
在C:
010
是8的八进制10
是10的小数。011
是9的八进制。而且,虽然我们正在......
100
是100的十进制数。如果你想要二元,你需要做一些不同的事情:
0b010
表示二进制常量。0
)或十六进制(起始0x
)第二部分的答案是,按位运算符不会变成布尔值&#34;。例如,在if
语句中,C将任何零或空值解释为false,并将任何非零值解释为true。在非布尔上下文中,它们只是数字,指针等等。