按位操作会产生不正确的结果
我对位操作相当陌生,所以如果我的问题看起来措辞不佳或不适合使用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,因为我的理解是010
和10
是相同的二进制文件(请纠正我,如果我错了)和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的八进制数 10
是10
的小数。 011
是9的八进制数。 而且,虽然我们在... ...
100
是100
的小数。 如果你想要二进制文件,你需要做不同的事情:
0b010
。 0
开始)或十六进制(从0x
开始) 第二部分的答案是,按位运算符不会“变成布尔值”。 C例如在if
语句中将任何零或空值解释为假,并将任何非零值解释为真。 在非布尔上下文中,它们只是数字,指针等等。