问题:为什么〜True导致-2?
在Python控制台中:
~True
给我:
-2
为什么?有人可以用二进制给我解释这个特殊情况吗?
回答 0
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
回答 1
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
有符号整数中的一个负数,请参见二进制补码:
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
其中起始1
位表示该值为负,其余位则对正数减去一的值进行反编码。
回答 2
~True == -2
是,如果不奇怪 True
的手段1
和 ~
方式按位反转 …
… 只要
True
可以视为整数,并且- 整数用二进制补码表示
编辑:
- 修复整数表示和按位求反运算符之间的混合
- 进行另一次抛光(信息越短,需要做的工作越多)