我在这里遇到了一个奇怪的问题。考虑一下这段代码:
#include <stdio.h>
int main()
{
printf("%u\n", (55 & 00000111) + 1);
return 0;
}
此代码在编译和执行时会产生2作为结果。
另一方面,Python产生了这个:>>> (55 & 0b00000111) + 1
8
为什么会有不同的结果?
答案 0 :(得分:5)
C没有二进制文字。所以00000111
不是你想象的二进制文字。相反,它被解释为八进制111
(或十进制73),因为0前缀表示C中的八进制。如果Python 0b00000111
是一个正确的二进制文字(注意b
之后0
}} 字首)。这就是为什么你在C和Python中获得不同结果的原因。
如果您想在C代码中使用二进制文字,我认为最好的方法是使用以0x
开头的十六进制文字,因为一个十六进制数字相当于4个二进制数字,它非常容易将十六进制文字转换为二进制文字,反之亦然。例如,您可以在示例中使用0x7
。
printf("%u\n", (55 & 0x7) + 1);
答案 1 :(得分:2)
以前缀0
开头的数字具有八进制表示,表示00000111
为octal 111 == 1 + 8 + 64 == 73
。
0b00000111
是二进制表示,意味着它的值为1 + 2 + 4 == 7
。
使用printf("%u\n", (55 & 00000111) + 1);
时,结果为2
,因为这两个数字中唯一的位是LSB
- &gt;它等于1
,并添加1
,您得到2
。
使用(55 & 0b00000111) + 1
时,55 == 32 + 16 + 4 + 2 + 1
表示所有3个最后位都打开,等于7
,并添加1
,您得到8
。
答案 2 :(得分:0)
C中前缀为0的数字在base-2(二进制)中不,但是base-8(八进制)在Python中,通过在数字前加上 {可以实现相同的效果{1}} 强>
0o
C不支持二进制整数常量。但是,作为扩展,GCC会这样做,所以
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
>>> (55 & 0o00000111) + 1
2
>>> 0o00000111
73
>>> 1 * 8 ** 2 + 1 * 8 ** 1 + 1 * 8 ** 0
73
可以使用GCC编译:
#include <stdio.h>
int main()
{
printf("%u\n", (55 & 0b00000111) + 1);
return 0;
}
正如其他人所指出的那样,十六进制比二进制方便得多 - 你只需要记住每个十六进制数字0-F如何以二进制形式查找,并用一个十六进制数字替换4位组:
% gcc bin.c && ./a.out
8
与二进制表示法不同,它适用于所有 C编译器和Python版本。
答案 3 :(得分:0)
您用于C的代码使用八进制整数,转换为十六进制时看起来像
0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
1个十六进制字符是4位。 而python中的代码使用二进制文字。