我对按位运算还很陌生,因此如果我的问题措辞不佳或不适合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,因为我理解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是否等于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。在非布尔上下文中,它们只是数字,指针等等。

09-26 01:16