为什么〜真的结果是-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 ,你会发现它本质上是数字 – 它有两个值, True和False ,它们只是整数1和0的“自定义”版本,只是自己打印的方式不同。 它们是整数typesint 子类 。
所以它们的行为与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
Python booltypes是int一个子类(出于历史原因;布尔值仅在Python 2.3中添加)。
由于int(True)是1 ,所以~True是~1是-2 。
为了说明为什么bool是int的子类,请参阅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可以被视为一个整数和 - 整数用二的补码表示
编辑:
- 修正了整数表示法和位反转运算符之间的混合
- 应用另一种抛光(信息越短,需要的工作越多)