在 Python 控制台中:
~True
给我:
-2
为什么?有人可以用二进制向我解释这个特殊情况吗?
int(True)
1
.
1
是:
00000001
~1
是:
11111110
这在 2 的补码1 中-2
翻转所有位,将结果数字加 1,并将结果解释为幅度的二进制表示并添加负号(因为数字以 1 开头):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
这是 2,但符号为负,因为 MSB 为 1。
值得一提的是:
想想bool
,你会发现它本质上是数字的——它有两个值,True
和False
,它们只是整数 1 和 0 的"定制"版本,只是打印自己不同。它们是整数类型 int
的子类。
因此,它们的行为与 1 和 0 完全相同,只是bool
重新定义了str
,repr
以不同的方式显示它们。
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
bool
类型是 int
的一个子类(由于历史原因;布尔值仅在 Python 2.3 中添加)。
由于int(True)
是1
,~True
是~1
是-2
。
请参阅 PEP 285 了解为什么 bool
是 int
的子类。
如果你想要布尔反转,请使用not
:
>>> not True
False
>>> not False
True
如果你想知道为什么~1
是-2
,那是因为你反转了有符号整数中的所有位; 00000001
变成有符号整数中的负数1111110
,请参阅 Two 的补码:
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
其中,初始1
位表示值为负,其余位编码正数减一的倒数。
True
表示1
而~
表示按位反转,~True == -2
也就不足为奇了......
。前提是
-
True
可以被视为整数和 - 整数用 Two 的补码表示
编辑:
- 修复了整数表示和按位反转运算符之间的混合
- 应用了另一次润色(消息越短,需要的工作越多)