【问题标题】:Binary Representations二进制表示
【发布时间】:2021-10-06 23:30:56
【问题描述】:

这是为什么

>>> print(f"{-5 & 0b1111: 04b}")
    1011

然而,

>>> print(f"{-5 | 0b0000: 04b}")
    -101

此外,

>>> print(f"{-5 | 0b1111: 04b}")
    -001

看来,首先 -5 被转换为 2 的补码,然后执行操作。然后,在“&”的情况下,输出被打印/解释为这样,但对于|,输出被转换回有符号的幅度表示。为什么会有这样的不对称?

【问题讨论】:

  • & 去掉了符号位,但 | 没有,所以这两个表达式的结果是不同的。 IMO 整个 Python 显示负二进制数的方式很奇怪。

标签: python binary representation


【解决方案1】:

-5 二进制(二进制补码)是 ...111111111011。 Python 可以处理任意精度的整数,并且没有一个很好的方法来打印出无限的前面的字符串,因此它表示带有减号的负二进制数。 (好吧,我们也许可以就此争论,但事实就是如此。)

具有正数的事物(如您的第一个示例)的按位和始终为正数,因为正数的前面的零将与任何东西结合以在结果中创建前面的零。

负数与任何事物的按位或(如在您的其他示例中)始终为负数,因为负数的前面的数字将与任何事物结合以在结果中创建前面的数字。

您看到的唯一区别是结果的符号。否定的结果总是用减号打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2011-04-17
    • 1970-01-01
    • 2016-05-01
    • 2015-03-27
    • 2011-03-24
    • 2017-06-26
    • 2015-01-21
    相关资源
    最近更新 更多