为什么 ~ True 的结果是 -2?

在 Python 控制台中:

~True

给我:

-2

为什么? 谁能用二进制解释一下这个案子?

6434 次浏览

Python bool类型是 int的一个子类(由于历史原因,布尔值只是在 Python 2.3中添加的)。

因为 int(True)1~True~1-2

请参阅 PEP 285了解为什么 boolint的一个子类。

如果你想要布尔逆,使用 not:

>>> not True
False
>>> not False
True

如果你想知道为什么 ~1-2,这是因为你正在反转一个有符号整数中的所有位; 00000001变成 1111110,在一个 签了整数中是一个负数,参见 两个人就够了:

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

其中初始 1位表示值为负,其余位编码正数减1的倒数。

int(True)1

1为:

00000001

~1为:

11111110

也就是 两个人就够了1中的 -2

翻转所有位,将1加到结果数字上,并将结果解释为大小为 二进制表示法的值,然后加上一个负号(因为数字以1开头) :

11111110 → 00000001 → 00000010
↑          ↑
Flip       Add 1

也就是2,但是符号是负的,因为 MSB是1。


值得一提的是:

考虑一下 bool,你会发现它本质上是数字的——它有两个值,TrueFalse,它们只是整数1和0的“定制”版本,只是打印它们自己的方式不同。它们是整数类型 int子类

除了 bool重新定义 strrepr以不同的方式显示它们之外,它们的行为完全与1和0一样。

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True


>>> True == 1
True
>>> True is 1  # they're still different objects
False

~True == -2不足为奇True意味着 1还有~意味着 按位反转按位反转..。

... 前提是


编辑:

  • 修正了整数表示和位反转算子之间的混合
  • 应用另一种抛光(信息越短,需要的工作就越多)