为什么~True导致-2?

时间:2014-02-19 13:04:51

标签: python data-conversion tilde

在Python控制台中:

~True

给我:

-2

为什么呢?有人可以用二进制解释这个特例吗?

3 个答案:

答案 0 :(得分:235)

什么是int(True)?它是1

1是:

00000001

~1是:

11111110

Two's complement 1

中的-2

1 翻转所有位,将1加到结果数字中,并将结果解释为幅度的二进制表示并添加一个负号(因为数字开始1):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

这是2,但由于MSB为1,因此符号为负。


值得一提:

考虑bool,您会发现它本质上是数字的 - 它有两个值,TrueFalse,它们只是整数的“自定义”版本1 0表示只能以不同方式打印自己。它们是整数类型int子类

所以它们的行为与1和0完全相同,只是bool重新定义strrepr以不同方式显示它们。

>>> 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了解boolint的子类的原因。

如果您想要布尔反转,请使用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> ...

... 提供


编辑:

  • 修复了整数表示和按位反转运算符之间的混合
  • 应用了另一次抛光(消息越短,需要的工作越多)