在Python控制台中:
~True
给我:
-2
为什么呢?有人可以用二进制解释这个特例吗?
答案 0 :(得分:235)
什么是int(True)
?它是1
。
1
是:
00000001
和~1
是:
11111110
中的-2
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
答案 1 :(得分:44)
Python 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's complement:
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
其中,初始1
位表示该值为负,其余位编码正数的倒数减1。
答案 2 :(得分:4)
~True == -2
表示True
并且 1
表示按位反转, ~
就不足为奇了/ EM> ...
... 提供
True
可以视为整数和编辑: