二进制表示
Binary Representations
这是为什么
>>> print(f"{-5 & 0b1111: 04b}")
1011
然而,
>>> print(f"{-5 | 0b0000: 04b}")
-101
此外,
>>> print(f"{-5 | 0b1111: 04b}")
-001
好像是先把-5转成2的补码再运算。然后,在 '&' 的情况下,输出是 printed/interpreted,但对于 |
,输出被转换回带符号的幅度表示。为什么会出现这种不对称?
-5 的二进制(二进制补码)是 ...111111111011。 Python 可以处理任意精度的整数,并且没有真正好的方法来打印出前面的无限字符串,所以它用负号表示负二进制数。 (好吧,我们也许可以争论这个,但事实就是如此。)
正数的按位与(如您的第一个示例)将始终为正数,因为正数的前面的零将与任何内容结合以在结果中创建前面的零。
负数与任何东西的按位或(如在您的其他示例中)始终为负数,因为负数的前一个将与任何东西结合以在结果中创建前一个。
您看到的唯一区别是结果的符号。否定结果始终以负号打印。
这是为什么
>>> print(f"{-5 & 0b1111: 04b}")
1011
然而,
>>> print(f"{-5 | 0b0000: 04b}")
-101
此外,
>>> print(f"{-5 | 0b1111: 04b}")
-001
好像是先把-5转成2的补码再运算。然后,在 '&' 的情况下,输出是 printed/interpreted,但对于 |
,输出被转换回带符号的幅度表示。为什么会出现这种不对称?
-5 的二进制(二进制补码)是 ...111111111011。 Python 可以处理任意精度的整数,并且没有真正好的方法来打印出前面的无限字符串,所以它用负号表示负二进制数。 (好吧,我们也许可以争论这个,但事实就是如此。)
正数的按位与(如您的第一个示例)将始终为正数,因为正数的前面的零将与任何内容结合以在结果中创建前面的零。
负数与任何东西的按位或(如在您的其他示例中)始终为负数,因为负数的前一个将与任何东西结合以在结果中创建前一个。
您看到的唯一区别是结果的符号。否定结果始终以负号打印。