137

在 Python 控制台中:

~True

给我:

-2

为什么?有人可以用二进制向我解释这个特殊情况吗?

4

3 回答 3

245

int(True)1

1是:

00000001

并且~1是:

11111110

这是-2二进制补码1

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
于 2014-02-19T13:09:39.963 回答
45

Pythonbool类型是int(出于历史原因;布尔值仅在 Python 2.3 中添加)的子类。

既然int(True)1~True就是~1-2

请参阅PEP 285了解为什么boolint.

如果您想要布尔逆,请使用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位表示该值为负数,其余位编码正数减一的倒数。

于 2014-02-19T13:07:21.197 回答
4

~True == -2如果手段手段按位反转也就不足为奇 了......True1 ~

...前提是


编辑:

  • 修复了整数表示和按位反转运算符之间的混合
  • 应用了另一个修饰(消息越短,需要的工作越多)
于 2014-02-20T08:47:19.227 回答