【发布时间】:2019-06-16 05:47:19
【问题描述】:
我正在研究二进制补码,并且遇到了两种将数字的二进制补码表示形式转换为其十进制表示形式的方法:
从初始二进制数中减去 1,然后按位求逆。将这个新的二进制数转换为十进制数并相应地调整符号。
对初始二进制数进行按位求逆,然后加 1。将此新二进制数转换为十进制数并相应调整符号。
为什么减1按位求逆就等于按位求逆加1?
【问题讨论】:
我正在研究二进制补码,并且遇到了两种将数字的二进制补码表示形式转换为其十进制表示形式的方法:
从初始二进制数中减去 1,然后按位求逆。将这个新的二进制数转换为十进制数并相应地调整符号。
对初始二进制数进行按位求逆,然后加 1。将此新二进制数转换为十进制数并相应调整符号。
为什么减1按位求逆就等于按位求逆加1?
【问题讨论】:
TL;DR
如果 −a==~a+1,则 ~a==−a−1 和 ~(a−1)==−(a−1)-1==−a
二进制补码的工作原理是将负数 an-|a|=2^n +一个。这样 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
ai=0 和 ~ai=1 或 ai=1 和 ~a i=0 和 a+~a=111..11=2^n-1
通过加一,我们可以看到 a+~a+1=2^n 以及 a 的补码em> 是 ~a+1。
作为~a+1=2^n-a
~a=2^n-a-1
如果我们用 (a−1) 替换 a,我们得到
~(a-1)=2^n-(a-1)-1
= 2^n−一个
= ~一个+1
所以 ~a+1 和 ~(a-1) 是相同的。
【讨论】: