如何将二进制补码转换为十进制数
十进制转二进制补码
我们知道将十进制数转换为二进制补码的方法是:
- 判断其是负数还是正数
- 将其转换为二进制
- 如果是正数,那么补码到此处就求出来了
- 如果是负数,还需要在保持符号位不变的情况下将其余位取反然后加一
还有一种方法:
假定所需转换的数字为
\[a_{(10)}
\]
下标表示这个数是十进制。如果我们希望用N位二进制表示这个数的补码,那么该数的补码为:
\[\text{dec2bin}(2^{N}-|a_{(10)}|)
\]
上式中dec2bin表示十进制转换为二进制,\(|\cdot|\)表示取绝对值。需要注意,N的取值一定要保证能够表示这个数。
二进制补码转十进制
上面是十进制数转二进制补码的方式。但是我发现有时候需要将二进制补码转换回十进制,后来就发现了这个规律:
设有一个二进制补码数字\(b_{(2)}\)
- 保持符号位不变,剩余位取反
- 加1
- 转换为十进制即可
例子
- 1_111 -> 1_000 -> 1_001 -> -1
- 1_01010 -> 1_10101 -> 1_10110 -> -22
验证一下:\(2^6-22=64-22=42=101010_{(2)}\),可以发现这是正确的。
还有一个方法就是:权重算法:
设一个2进制补码数据B,共有N位,那么其十进制数为:
\[B_{(10)} =(-1)^{B[N-1]}*2^{N-1} + \sum_{i=0}^{N-2}2^{i}\times B[i]
\]
依然利用上面的例子:
- 1_111 -> \((-1)^{1}*2^{4-1} + 1*2^{0} + 1*2^{1} + 1*2^{2} = -8 + 1 + 2 + 4 = -1\)
- 1_01010 -> \((-1)^{1}*2^{6-1} + 0*2^{0} + 1*2^{1} + 0*2^{2} + 1*2^{3} + 0*2^{4} = -32 + 0 + 2 + 0 + 8 + 0 = -22\)