可是下一次课还是课程设计, 老师竟然要求在这个加法器上实现减法 , 这可把大胖给难住了, 在加法器上实现减法, 真是个变态的需求。
遇到了问题, 张大胖自然会“跪求”好基友, 电脑高手Bill。
Bill 说: “这个要求一点都不变态,用加法器同时实现加法和减法, 能极大的节省CPU的电路设计。 ”
“你就说该怎么实现吧”
Bill说:“我先给你说一下原理, 在你定义的4位二进制中,一共可以表达16个数, 我们引入一个‘补数 '的概念, 例如 3的补数 是 13, 4的补数是12, 5 的补数是11, 当你计算7减去3 的时候, 可以变成 7加上3 的补数, 即 7 + 13 ”
“可是7+13 是20 , 但是7-3 等于4 啊”
“20其实已经超出你4位二进制能表达的16个数了, 已经溢出了,对吧, 所以20还得减去16 , 就是4 了。 你用二进制算一下。”
7-3 = 0111- 0011 = 0111 + 1101(二进制13) = 10100
10101已经溢出了, 去掉最高位是 0100 ,就是十进制4 了。
“果然不错” 张大胖说 “这让我想到了钟表, 现在是7点, 我想让它回到4点, 有两种办法, 一种方法是让时针后退 3 格, 另外一种方法是让时针前进9格, 前进到12点的时候, 其实就相当于溢出了, 舍弃掉。 "
Bill 说, "看来你已经Get了, 数学上有个词叫做求模, 说的就是这个运算, 还以时钟为例"
向后退3格: 7 - 3 = 4
向前进9格 : (7 + 9) mod 12 = 4
向前进21格: (7+9+12) mod 12 = 4
向前进33格: (7+9+12+12) mod 12 = 4
.....
“这是一种以进为退的策略” Bill 接着说 " 用这种办法就把减法变成了加法"
“但是我怎么得到所谓的补数呢? 从3 怎么得到13 呢”
“这很简单, 对于二进制, 前辈们想出了一个异常简单, 又特别适合计算机的算法, 对二进制数的所有位取反, 然后加1 ”