我正在研究二的补码,并且遇到了将数字的二的补码表示转换为小数表示的两种方法:
从初始二进制数减去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)是相同的。