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


    上一篇博文中我们用基本的逻辑门实现了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,表示溢出。

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


  • 相关阅读:
    Intent
    What should we do next in general after collecting relevant data
    NOTE FOR Secure Friend Discovery in Mobile Social Networks
    missing pcap.h
    after building Android Source code
    plot point(one column)
    When talking to someone else, don't infer that is has been talked with others at first. It may bring repulsion to the person who is talking with you.
    进程基本知识
    Python input和raw_input的区别
    强制 code review:reviewboard+svn 的方案
  • 原文地址:https://www.cnblogs.com/hitfredrick/p/6403010.html
Copyright © 2020-2023  润新知