~ Python 3 中的二进制补码

Rah*_*hra 4 bitwise-operators python-3.x

只是对二进制补码的工作方式有疑问。例如(在python中):

a = 60
print(~a)
Run Code Online (Sandbox Code Playgroud)

给出一个输出:-

-61
Run Code Online (Sandbox Code Playgroud)

不是二进制的补码60是:

a = 0011 1100
~a  = 1100 0011
Run Code Online (Sandbox Code Playgroud)

不应该-60吗?

我知道我错了,但为什么它会向前移动-61

Ser*_*kov 6

~是一个按位反转运算符,它的作用完全按照定义

x 的按位反转定义为 -(x+1)。

这就是整数的二进制补码表示的按位反转的工作原理。

二进制补码轮很好地形象化了这一点:

在此处输入图片说明

如您所见,1 的按位反转为 -2,2 的按位反转为 -3,...,60 的按位反转将为 -61。


Yua*_* JI 3

你快到了。1100 0011实际上是-61

以下是二进制转换为十进制的方法:

  1. 反转位

  2. 添加 1

  3. 转换为十进制

  4. 添加负号

所以:

1100 0011

0011 1100 <-- bits inverted

0011 1101 <-- one added

       61 <-- converted to decimal

      -61 <-- added negative sign
Run Code Online (Sandbox Code Playgroud)

来自维基百科的二进制补码页面

N 位数字的二进制补码定义为其相对于 2^N 的补码。例如,对于三位数字 010,其补码为 110,因为 010 + 110 = 1000。

这里1100 0011的补码是0011 1101cuz

    1100 0011
+   0011 1101
-------------
  1 0000 0000 
Run Code Online (Sandbox Code Playgroud)