Published on

方便做减法的补码(备忘)

Authors

今天偶然翻到很久前做的关于补码的笔记,发觉初中觉得那么难的逻辑在现在看来竟是如此简单 在第一次领略逻辑电路的奥妙后完全被震惊,竟然不曾考虑这减法背后简洁朴素的数学原理

1011b - 0110b = 0101b

上面这个例子(a - b = c)是个典型的需要借位的减法, 但是可以只用加法的进位完成运算

过程

这里假设运算所用的机器字长为 4bit

  1. 先取减数 b 的补码(按位取反再加 1)

得到补码 1010b

  1. 用减数 a 加上 b 的补码得到结果 10101b

1011b + 1010b = 10101b

  1. 由于字长限制,最高位抹去得到结果 0101b

数学原理

这个思想的精髓就是下面这个式子

max_1 - b + a - max_1

  • 设 1111b 为 max_0, 10000b 为max_1
  • 按位取反再加 1 实际就是用 max_1 去减 b, 而这些操作完全用不到借位
    • 这一步的分解是 max_0 - b + 1b = max_1 - b
    • 也就是 10000b = 1111b + 1b; 1111b 相当于十进制的 9999, 这类数的特点是做减法不用借位
    • 而 1111b 的另一个优点是不仅不用借位而且只需要做取反操作就可以了
  • 最后一个简单的加法完美地结束了减法运算