我正在研究二进制补码,并遇到了两种将数字的二进制补码表示形式转换为其十进制表示形式的方法:
从初始二进制数中减去1,然后进行按位求逆。将这个新的二进制数转换为十进制数并相应地调整符号。
对初始二进制数进行按位求逆,然后加 1。将这个新的二进制数转换为十进制数并相应地调整符号。
为什么减 1 并进行按位求逆相当于按位求逆并加 1?
TL;博士
如果 −a==~a+1,则 ~a==−a−1 和 ~(a−1)==−(a−1)-1==−一个
二进制补码的工作原理是编码一个负数a<0 by 2^n−|a|=2^n+a。这样 a+(−a)=2^n 并且如果忽略 n−1 以上的位,则 −a 的代码具有与 −a 相同的加法数学属性。
因此,找到 a 的补码 b 的问题就是找到一个数字 b,例如 a+b=2^n。
我们可以看到 a, ~a almost 的二进制补码具有这个性质。
a an-1 an-2 ... a1 a0
+ ~a ~an-1 ~an-2 ... ~a1 ~a0
---------------------------------
= 1 1 ... 1 1
ai=0 和 ~ai=1 或 ai=1 和 ~ai=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) 是相同的。
不明白第一个答案的解释,但据我所知(如果错误请纠正我)但假设我们有一个二进制数 10011 使用 C2 使得它如此 第一步: 反转 10011 => 01100 第二步: 加 1 => 01100+1= 01101
现在从我得到的一个练习中得知,二进制数是用 C2 编码的 转换为十进制示例:100100 第一步: 子 1 100100-1=> 100011 第二步: 反转 100011 => 100011