我正在做一个非常琐碎的计算机科学家庭作业,围绕 C 中的按位运算符,但我遇到了一个问题,我不知道为什么会发生这种情况。这是我正在运行的代码。
#include <stdio.h>
int main(int argc, char *argv[]){
int bitPattern1 = 0x10011001;
int bitPattern2 = 0x01100110;
int bitPattern3 = 0xFFFFFFFF;
int bitPattern4 = 0x00000000;
/* pair 1 */
printf("bitPattern1 & bitPattern2 = %x\n", bitPattern1 & bitPattern2);
printf("bitPattern1 && bitPattern2 = %x\n", bitPattern1 && bitPattern2);
/* pair 2 */
printf("bitPattern1 | bitPattern2 = %x\n", bitPattern1 | bitPattern2);
printf("bitPattern1 || bitPattern2 = %x\n", bitPattern1 || bitPattern2);
/* pair 3 */
printf("bitPattern1 & bitPattern3 = %x\n", bitPattern1 & bitPattern3);
printf("bitPattern1 && bitPattern3 = %x\n", bitPattern1 && bitPattern3);
/* pair 4 */
printf("bitPattern1 | bitPattern3 = %x\n", bitPattern1 | bitPattern3);
printf("bitPattern1 || bitPattern3 = %x\n", bitPattern1 || bitPattern3);
/* pair 5 */
printf("bitPattern2 & bitPattern4 = %x\n", bitPattern2 & bitPattern4);
printf("bitPattern2 && bitPattern4 = %x\n", bitPattern2 && bitPattern4);
/* pair 6 */
printf("bitPattern2 | bitPattern4 = %x\n", bitPattern2 | bitPattern4);
printf("bitPattern2 || bitPattern4 = %x\n", bitPattern2 || bitPattern4);
return 0;
}
问题发生在第 4 对的第一部分,它返回以下结果:
bitPattern1 | bitPattern3 = ffffffff
bitPattern1 || bitPattern3 = 1
为什么按位运算符返回“f”我查阅了文档,并且我认为 OR 运算符返回 1 或零,似乎该示例应该返回“11111111”。与十六进制数有关吗?我在 google 上找不到任何信息。
最佳答案
首先,OR 的输入为十六进制表示法的 FFFFFFFF
,这意味着以二进制(按位)形式表示为 11111111111111111111111111111111
。 IE。它比您引用的 1
多得多(确切地说是 32 位)。
其次,所讨论的按位或确实应该以二进制表示法返回1111111...1
。这正是它返回的结果。但是,当您以十六进制表示法打印结果时,您会得到FFFFFFFF
。您通过在 printf
中使用 x
格式说明符明确请求十六进制表示法。
不幸的是,printf
没有用于生成二进制表示法的格式说明符。然而,将十六进制转换为二进制是一项微不足道的任务,因为它是用四个二进制数字直接替换每个十六进制数字。 F
代表 1111
,因此如您所见,按位计算,您的 OR 确实产生了 11111111111111111111111111111111
,正如它应该的那样。
关于C 按位或返回 "f",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293497/