加法的实现

在上一篇《道生一,一生二,二生三,三生万物》中,我们提到任意的运算都可以由与、或、非三种基本的逻辑运算实现。这篇文章将通过一个例子对其作出一个直观的解释。

下面真值表中所表示的逻辑运算有三个输入,ABCin,两个输出,CoutS

Truth Table - Full Adder

细心的朋友可能会发现,这个真值表实现了加法的功能。其中

  • Cout代表相加后是否产生进位
  • S代表相加后不考虑进位的和
  • A,B代表加数
  • Cin代表低位送来的进位。

先以大家熟悉的以十进制加法为例,当计算的78+29时,我们首先进行个位的加法。此时

  • A = 8, B = 9, Cin = 0,A + B + Cin = 17

由于产生了进位,Cout = 1, S = 7。现在计算十位:

  • A = 7, B = 2, Cin = 个位的Cout = 1, A + B + Cin = 10

三个数相加后又产生了进位,因此Cout = 1, S = 0。我们把最后得出的Cout,十位的S, 个位的S串起来,就得到了正确答案107。对于二进制加法,其原理和十进制是一样的,只不过由原来的逢十进一变成了逢二进一,如下:

  • 0 + 0 + 0 = 0
  • 0 + 0 + 1 = 1
  • 0 + 1 + 1 = 10(进位,等于十进制中的“2”)
  • 0 + 1 + 1 = 11(进位,等于十进制中的“3”)

上述的基本二进制加法正是真值表中所表述的运算,那么我们怎么用与、或、非三种操作,来表示计算结果CoutS呢?以输出S为例,如果使用通俗的语言,那就是:

  • 当[A, B, Cin] = 001,或者[A, B, Cin] = 010,或者[A, B, Cin] = 100, 或者[A, B, Cin] = 111时,S的值为1。

如果我们把四种[A, B, Cin]的取值分别写作T1, T2, T3, T4,那么从逻辑运算的角度出发:

  • S = T1 OR T2 OR T3 OR T4

一般我们用加号表示“或”运算,所以上式也可以写作

  • S = T1 + T2 + T3 + T4(不要与数值运算中的加号混淆)

现在问题被成功的转化为如何用A, B, Cin来表示T1, T2, T3, T4。以T1 = [A, B, Cin] = 001为例,我们需要:

  • A等于1,并且B等于1,并且Cin等于1。

用逻辑运算的语言来描述,则是:

  • T1 = (NOT A) AND (NOT B) AND Cin

一般我们用A'表示NOT A, 用AB直接表示A AND B,进一步化简可得:

  • T1 = A'B'Cin

我们用反复使用同样的思路和方法,可以轻松得出:

  • S = A'B'Cin + A'BCin' + AB'Cin' + ABCin
  • Cout = A'BCin + AB'Cin + ABCin' + ABCin

这就是为什么我们可以通过与、或、非三种操作实现任意的逻辑运算。当然在实际的设计中,有许多逻辑运算可以被化简,例如ABCin' + ABCin = AB(Cin' + Cin) = AB,不过这不在本文的讨论的范围中,也并不影响上述结论。

Leave a Reply

Your email address will not be published. Required fields are marked *