〜Python 3中的二进制补码

时间:2019-03-13 15:01:30

标签: python-3.x bitwise-operators

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

a = 60 print(~a)

提供输出:- -61

60的二进制补码不是:-

a = 0011 1100

〜a = 1100 0011

应该不是-60吗?

我知道我错了,但是为什么它会前进到-61

3 个答案:

答案 0 :(得分:1)

在所有现代计算机中,二进制补码2用于表示整数(而不是经典二进制表示)。 正如Python docs中确认的那样:

二进制补码与经典二进制相同 正整数的表示形式,但对于 负数。负数通过执行 对其绝对值进行二的补数运算。

使用(x-1)的位模式写一个负数的2的补码-x,所有位都被补充(从1切换为0或从0切换为1)。

示例: -15的2的补数:

-15 => complement(x-1) => complement(15-1) => complement(14) => complement(1110) => 0001

Python的〜(按位NOT)运算符返回数字的1的补码。

示例:

print(~14) # Outputs -15

14是2的补码二进制形式的(1110)。

此处,〜14会将这种形式的所有位都反转(即1的补码)为0001。 但是,0001实际上是-15的2的补数。

记住整数的按位NOT运算的简单规则是-(x + 1)。

print(~60) # Outputs -61
print(~-60) # Outputs 59

答案 1 :(得分:0)

您快到了。 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

摘自维基百科的Two's complement page

  

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

1100 0011的补码为0011 1101 cuz

    1100 0011
+   0011 1101
-------------
  1 0000 0000 

答案 2 :(得分:0)

~是按位求反运算符,it acts exectly as defined

  

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

这就是整数two's complement representation的按位求反的原理。

两个补码轮很好地显示了这一点:

enter image description here

如您所见,按位倒数1为-2,按位倒数2为-3,...,而按位倒数60为-61。