zoukankan      html  css  js  c++  java
  • 编码:隐匿在计算机软硬件背后的语言(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,表示溢出。

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


  • 相关阅读:
    JavaScript 把函数作为参数进行传值
    面向微服务的企业云计算架构转型
    bzoj1009 GT考试 (kmp+矩阵优化dp)
    noiac64 sort (二分答案)
    luogu1983 车站分级 (拓扑排序)
    loj6157 A ^ BProblem (并查集)
    bzoj1831 逆序对 (dp+树状数组)
    luogu2282/bzoj1219 历史年份 (dp+hash+二分+线段树)
    bzoj3702/bzoj2212 二叉树 (线段树合并)
    cf1073G Yet Another LCP Problem (SA+权值线段树)
  • 原文地址:https://www.cnblogs.com/hitfredrick/p/6403010.html
Copyright © 2011-2022 走看看