按位操作:C与Python
我面临着一个奇怪的问题。考虑这段代码:按位操作:C与Python,python,c,python-2.7,bit-manipulation,bitwise-operators,Python,C,Python 2.7,Bit Manipulation,Bitwise Operators,我面临着一个奇怪的问题。考虑这段代码: #include <stdio.h> int main() { printf("%u\n", (55 & 00000111) + 1); return 0; } 为什么会有不同的结果?以前缀0开头的数字有八进制表示,这意味着00000111是八进制111==1+8+64==73 0b00000111是二进制表示,这意味着它的值为1+2+4==7 使用printf%u\n时,55&
#include <stdio.h>
int main()
{
printf("%u\n", (55 & 00000111) + 1);
return 0;
}
为什么会有不同的结果?以前缀0开头的数字有八进制表示,这意味着00000111是八进制111==1+8+64==73 0b00000111是二进制表示,这意味着它的值为1+2+4==7 使用printf%u\n时,55&00000111+1;结果是2,因为两个数字中唯一的一位是LSB->它等于1,加上1,得到2
当使用55&0b00000111+1时,55==32+16+4+2+1意味着最后3位全部开启,等于7,加上1,得到8。以前缀0开头的数字有八进制表示,意味着00000111是八进制111==1+8+64==73 0b00000111是二进制表示,这意味着它的值为1+2+4==7 使用printf%u\n时,55&00000111+1;结果是2,因为两个数字中唯一的一位是LSB->它等于1,加上1,得到2
当使用55&0b00000111+1时,55==32+16+4+2+1意味着最后3位都是开的,等于7,加上1,得到8。C没有二进制的文字。所以00000111并不像您假设的那样是二进制文字。相反,它被解释为八进制111或十进制73,因为0前缀表示C中的八进制。在Python中,0b00000111是一个正确的二进制文字,请注意0前缀后的b。这就是为什么在C和Python中会得到不同的结果 如果您想在C代码中使用二进制文字,我认为最好的方法是使用以0x开头的十六进制文字,因为一个十六进制数字相当于4个二进制数字,并且很容易将十六进制文字转换为二进制文字,反之亦然。例如,您可以在示例中使用0x7
printf%u\n,55&0x7+1 C没有二进制的文本。所以00000111并不像您假设的那样是二进制文字。相反,它被解释为八进制111或十进制73,因为0前缀表示C中的八进制。在Python中,0b00000111是一个正确的二进制文字,请注意0前缀后的b。这就是为什么在C和Python中会得到不同的结果 如果您想在C代码中使用二进制文字,我认为最好的方法是使用以0x开头的十六进制文字,因为一个十六进制数字相当于4个二进制数字,并且很容易将十六进制文字转换为二进制文字,反之亦然。例如,您可以在示例中使用0x7
printf%u\n,55&0x7+1 C中以0为前缀的数字不是base-2二进制,而是Python中的base-8八进制,同样可以通过以0o为前缀来实现 C不支持二进制整数常量。然而,作为一个扩展,GCC确实如此
#include <stdio.h>
int main()
{
printf("%u\n", (55 & 0b00000111) + 1);
return 0;
}
正如其他人所指出的,无论如何十六进制比二进制更方便-您只需记住每个十六进制数字0-F在二进制中的外观,并用一个十六进制数字替换4位的组:
0000 | 0111
0 7
---> 0x07
与二进制表示法不同,这在所有C编译器和Python版本中都同样适用。C中以0为前缀的数字不是以base-2二进制表示的,而是以base-8八进制表示的。在Python中,以0为前缀的数字也可以实现这一点 C不支持二进制整数常量。然而,作为一个扩展,GCC确实如此
#include <stdio.h>
int main()
{
printf("%u\n", (55 & 0b00000111) + 1);
return 0;
}
正如其他人所指出的,无论如何十六进制比二进制更方便-您只需记住每个十六进制数字0-F在二进制中的外观,并用一个十六进制数字替换4位的组:
0000 | 0111
0 7
---> 0x07
与二进制表示法不同,这在所有C编译器和Python版本中都可以使用。用于C的代码使用八进制整数,当转换为十六进制时
0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
1个十六进制字符为4位。
而python中的代码使用二进制文本。用于C的代码使用八进制整数,当转换为十六进制时
0xfollowed by eight characters(32 bits) here in octal ... 001 001 001
1个十六进制字符为4位。
而python中的代码使用二进制文本。00000111不是二进制常量,我不知道,但它是什么呢?另外,你的意思是C代码中的00000111吗?一般来说,如果你怀疑一种语言做了一个简单的计算错误,请检查你的代码。这个问题的可能性要高得多。00000111不是一个二元恒量,因为我不知道这里,但它是什么呢?另外,你的意思是C代码中的00000111吗?一般来说,如果你怀疑一种语言做了一个简单的计算错误,请检查你的代码。机会更大,问题就在那里。谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯谢谢你的解释。我能够修复我的代码。干杯