您的位置:首页 > 理论基础

编码:隐匿在计算机软硬件背后的语言(4)--二进制减法器

2016-12-04 21:45 441 查看

上一篇博文中我们用基本的逻辑门实现了8位二进制数的加法器,本文主题是在上文中加法器的基础上实现8位二进制减法器功能。

加法和减法在某些方面互相补充,但在机制方面这两种运算并不同。加法中会涉及到进位,减法中没有进位,而是借位--一种与加法存在本质区别的麻烦机制。下面我们先从十进制的减法开始,逐渐过渡到二进制的减法。

先看一个例子:253-176=??

当我们解决一个问题时,如果能用到我们已经知道的知识,那么问题解决起来就会快捷;然而如果要研究出一种新的方法,这固然很好,但是这往往并不是一种最有效的途径。这里用一个小技巧来让减法不涉及到借位(先说明过程然后解释原因),由于减法与计算机中以二进制编码的存储有关,详细地了解减法也很重要。

为了避免借位,我们从一串9中减去减数(在上例中是999,因为减数是176,三位),即999-176=823。我们称从一串9中减去一个数叫做对9求补数,上例中176对9的补数是823,反之823对9的补数是176。这样就不需要借位。

然后将补数加1,并与原来的被减数相加,即823+1+253=1077。最后将结果减去1000,1077-1000=77。


为什么这样行得通呢?整个过程表示如下:(999-176)+1+253-1000=253-176。看上去把问题复杂化了,因为我们用两个加法和两个减法来实现一个减法,但是我们避免了借位,实际上更简单了(现在我们并没有直接实现减法,但是已经有加法器)。有人可能会问,如果被减数小于减数怎么办?此时我们可以将减数与被减数交换位置,然后对最终结果取反。但对于加法器来说没发表示复数,这里姑且将复数表示为溢出。


那么对于二进制数呢?


还是上面的例子,253-176=??

我们将253和176分别表示为二进制,则有1111 1101-1011 0000 =????????

仿照十进制的做法,我们先求减数对1的补数(十进制是减数对9的补数),即用1111 1111-1011 0000。这里注意一下,求对1的补数并不需要这么复杂,只需要将减数取反即可,即1011 0000->0100 1111为减数对1的补数。将补数加1然后与被减数相加,即0100 1111+1+1111 1101 = 1 0100 1101,然后减去1 0000 0000,得到0100 1101换算成十进制数就是77。

当减数大于被减数时,姑且以溢出论。


上文中我们实现的加法器如下图所示


为了实现减法器,我们在增加几个输入:sub位,0表示做加法,1表示做减法;求补器。

这是求补器需要说明一下,最简单的做法就是利用反向器实现,如下图所示。


但是该电路只会对输入求反,而我们既要实现加法器又要实现减法器。对于异或门我们知道,当两个输入中一个输入为0时不改变另一个输入的值;当一个输入为1时,另一个值反向。于是,我们该为如下电路。


当求反位为0时,不改变输入(此时实现加法器);当取反位为1时,输入反向(实现减法)。

对于本例,上图可如下表示


我们将上文中实现的加法器做如下改变


图中三个sub位就是加减法转换开关。下面说明一下工作原理。

当做加法时,也就是sub位为0时,对于求补器不改变输入的值,对于最高位的进位sub位也并不改变CO的值,一切看起来跟加法器并无两样,此时实现加法。

当做减法时,sub位为1。首先减数B(7-0)由于异或门sub位为1,故取反。CI=sub=1,从而实现了取反加1的目的。利用加法器的功能将其与被减数A(7-0)相加,最后减去1 0000 0000。当CO位为1时,sub位为1,对CO取反,CO变为0;当CO位为0时,此时减数大于被减数,sub为1使得CO也变为1,表示溢出。

这样就在加法器的基础上增加了减法器的功能。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: