为什么〜真的结果是-2?

在Python控制台中:

~True 

给我:

 -2 

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

什么是int(True) ? 它是1

1是:

 00000001 

~1是:

 11111110 

在二的补码 1中-2

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

 11111110 → 00000001 → 00000010 ↑ ↑ Flip Add 1 

这是2,但是因为MSB是1,所以这个符号是负的。


值得一提:

想想bool ,你会发现它本质上是数字 – 它有两个值, TrueFalse ,它们只是整数1和0的“自定义”版本,只是自己打印的方式不同。 它们是整数typesint 子类

所以它们的行为与1和0完全一样,除了bool重新定义strrepr以不同的方式显示它们。

 >>> type(True) <class 'bool'> >>> isinstance(True, int) True >>> True == 1 True >>> True is 1 # they're still different objects False 

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

由于int(True)1 ,所以~True~1-2

为了说明为什么boolint的子类,请参阅PEP 285 。

如果你想要布尔逆, 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可以被视为一个整数和
  • 整数用二的补码表示

编辑:

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