我对按位运算还很陌生,因此如果我的问题措辞不佳或不适合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("%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
是相同的二进制文件(如果我错了,请更正)和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
是否等于true?任何建议表示赞赏。编辑:我明白了为什么我的问题现在不清楚,因为我忘了提到我正在使用的整数常量的类型。我的意图是使用二进制而不是八进制,因此对此感到抱歉。
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
是十进制的十进制。011
是八进制的9。
而且,当我们在这里时...100
是100的十进制数。
如果要使用二进制文件,则需要执行其他操作:
一些编译器/标准接受0b010
表示二进制常量。
否则,您需要转换为十进制,八进制(以0
开头)或十六进制(以0x
开头)
第二部分的答案是按位运算符不会“变成布尔值”。例如,C在if
语句中将任何零或null值解释为false,而将任何非零值解释为true。在非布尔上下文中,它们只是数字,指针等等。