在 Python 控制台中:
~True
给我:
-2
为什么?有人可以用二进制向我解释这个特殊情况吗?
int(True)是1。
1是:
00000001
并且~1是:
11111110
这是-2二进制补码1
1翻转所有位,将结果数加 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
Pythonbool类型是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
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
其中初始1位表示该值为负数,其余位编码正数减一的倒数。
~True == -2如果手段和手段按位反转也就不足为奇 了......True1 ~
...前提是
True可以被视为一个整数和编辑: