为什么〜真的结果是-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 bool
types是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
可以被视为一个整数和 - 整数用二的补码表示
编辑:
- 修正了整数表示法和位反转运算符之间的混合
- 应用另一种抛光(信息越短,需要的工作越多)