在 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
如果手段和手段按位反转也就不足为奇 了......True
1
~
...前提是
True
可以被视为一个整数和编辑: