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.
| 归档时间: |
|
| 查看次数: |
6097 次 |
| 最近记录: |