如何将二进制补码转换为十进制数

十进制转二进制补码

我们知道将十进制数转换为二进制补码的方法是:

  • 判断其是负数还是正数
  • 将其转换为二进制
  • 如果是正数,那么补码到此处就求出来了
  • 如果是负数,还需要在保持符号位不变的情况下将其余位取反然后加一

还有一种方法:
假定所需转换的数字为

\[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\)
posted @ 2022-01-15 18:02  Vinson88  阅读(4720)  评论(0编辑  收藏  举报