为什么它减去1并进行按位逆运算等效于进行按位逆并加1?

时间:2019-06-16 05:47:19

标签: binary twos-complement

我正在研究二的补码,并且遇到了将数字的二的补码表示转换为小数表示的两种方法:

  1. 从初始二进制数减去1,然后按位求逆。将此新的二进制数字转换为十进制数字,并相应地调整符号。

  2. 对初始二进制数进行逐位逆运算,然后加1。将此新二进制数转换为十进制数,并相应地调整符号。

为什么要减去1并按位求逆就等于按位求逆并加1?

1 个答案:

答案 0 :(得分:0)

TL; DR
如果− a ==〜 a +1,则〜 a == − a−1和〜( a −1)== −( a −1)-1 == − a

二进制补码通过将负数 a <0乘以2 ^ n -| a | = 2 ^ n来工作 + a 。这样 a +(- a )= 2 ^ n ,如果忽略了 n -1以上的位, - a 的代码具有与- a 相同的数学属性。

因此,找到 a 的补码 b 的问题是找到数字 b ,例如 a + b = 2 ^ n
我们可以看到 a ,〜 a 几乎的二进制补码具有此属性。

    a    an-1  an-2    ...  a1    a0
 + ~a   ~an-1 ~an-2    ... ~a1   ~a0
   ---------------------------------
 =          1     1    ...   1     1

a i = 0和〜 a i = 1或 a i = 1和〜 a i = 0和 a +〜 a = 111..11 = 2 ^ n −1
通过添加一个,我们可以看到 a +〜 a + 1 = 2 ^ n a 是〜 a +1。

为〜 a + 1 = 2 ^ n a
a = 2 ^ n a -1
如果将( a −1)替换为 a ,则得到
〜( a -1)= 2 ^ n −( a -1)-1
= 2 ^ n− a
=〜 a +1

所以〜 a +1和〜( a -1)是相同的。