为什么~True导致-2?

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重新定义strrepr以不同方式显示它们.

>>> 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)

  • @etrusco你在说什么语言?我确切地知道0在哪里'True == -1`,我知道很多人可以说'True == 1` ...... (5认同)

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.

  • @GrijeshChauhan [`bin`](http://docs.python.org/2/library/functions.html#bin) (6认同)
  • 我们有任何函数在Python中显示位吗? (3认同)
  • @thefourtheye:我使用位掩码:`format(-2&((1 << 32) - 1),"032b")` (2认同)