在上一篇《道生一,一生二,二生三,三生万物》中,我们提到任意的运算都可以由与、或、非三种基本的逻辑运算实现。这篇文章将通过一个例子对其作出一个直观的解释。
下面真值表中所表示的逻辑运算有三个输入,A,B,Cin,两个输出,Cout和S。
细心的朋友可能会发现,这个真值表实现了加法的功能。其中
- 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”)
上述的基本二进制加法正是真值表中所表述的运算,那么我们怎么用与、或、非三种操作,来表示计算结果Cout和S呢?以输出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,不过这不在本文的讨论的范围中,也并不影响上述结论。