- Published on
方便做减法的补码(备忘)
- Authors
- Name
- zwindl
- @zwindl
今天偶然翻到很久前做的关于补码的笔记,发觉初中觉得那么难的逻辑在现在看来竟是如此简单 在第一次领略逻辑电路的奥妙后完全被震惊,竟然不曾考虑这减法背后简洁朴素的数学原理
例
1011b - 0110b = 0101b
上面这个例子(a - b = c)是个典型的需要借位的减法, 但是可以只用加法的进位完成运算
过程
这里假设运算所用的机器字长为 4bit
- 先取减数 b 的补码(按位取反再加 1)
得到补码 1010b
- 用减数 a 加上 b 的补码得到结果 10101b
1011b + 1010b = 10101b
- 由于字长限制,最高位抹去得到结果 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 的另一个优点是不仅不用借位而且只需要做取反操作就可以了
- 最后一个简单的加法完美地结束了减法运算