luk*_*ups 132 python data-conversion tilde
在Python控制台中:
~True
Run Code Online (Sandbox Code Playgroud)
给我:
-2
Run Code Online (Sandbox Code Playgroud)
为什么?有人能用二进制解释这个特例吗?
Mar*_*oun 238
什么是int(True)
?是的1
.
1
是:
00000001
Run Code Online (Sandbox Code Playgroud)
并~1
是:
11111110
Run Code Online (Sandbox Code Playgroud)
这是-2
在两个补1
1翻转所有位,将1加到结果数字中,并将结果解释为幅度的二进制表示,并添加一个负号(因为数字以1开头):
11111110 ? 00000001 ? 00000010
? ?
Flip Add 1
Run Code Online (Sandbox Code Playgroud)
这是2,但由于MSB为1 ,因此符号为负.
值得一提:
想想bool
,你会发现,它的本质上的数字-它有两个值,True
并且False
,他们只是"定制化"的整数1和0,仅打印自己不同的版本.它们是整数类型的子类int
.
因此它们的行为与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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 44
Python bool
类型是int
(由于历史原因; booleans仅在Python 2.3中添加)的子类.
由于int(True)
IS 1
,~True
是~1
被-2
.
请参阅PEP 285,了解为什么bool
是子类int
.
如果您想要布尔逆,请使用not
:
>>> not True
False
>>> not False
True
Run Code Online (Sandbox Code Playgroud)
如果你想知道为什么~1
是-2
,那是因为你是一个反相的符号整数所有位; 00000001
变为1111110
有符号整数中的哪一个是负数,请参见二进制补码:
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
Run Code Online (Sandbox Code Playgroud)
其中初始1
位表示该值为负,其余位编码正数的倒数减1.