posts - 58,  comments - 211,  trackbacks - 0

    数学中最简单的运算就是加法和减法。然而在计算机中,最简单的运算却是 AND、OR 和 NOT。

    一、AND

    物理课上,我们都作过串联实验。把两个开关依次起来之后,如果还要点亮灯泡,就必须同时闭合两个开关。

串联的开关

    将开关闭合定义为1,开关断开定义为0;将灯泡点亮定义为1,灯泡熄灭定义为0。则串联的两个开关与灯泡的关联规则是:

(0 0) -> 0 
(1 0) -> 0 
(0 1) -> 0 
(1 1) -> 1 

 

    这个规则与布尔代数中的 AND 操作规则完全一致。
(0 AND 0) -> 0 
(1 AND 0) -> 0 
(0 AND 1) -> 0 
(1 AND 1) -> 1 

 

    于是,将串联的开关作为输入,就灯泡的亮灭作为输出,上面的电路图就构成了计算机中AND操作(与门)的基本结构。当然计算机中的与门没有这么简单,实际上是通过两个继电器(或缓冲器)来实现的,只是基本原理如此。与门的符号如下:

与门

  

    二、OR

    提到串联自然会想到并联。把两个开关并联起来,如果还要点亮灯泡,闭合任何一个开关都可以了。

并联的开关

    同样的定义,开关断开闭合与灯泡亮灭的规则为:   

(0 0) -> 0 
(1 0) -> 1 
(0 1) -> 1 
(1 1) -> 1 

 

    这个规则与布尔代数中的 OR 操作规则完全一致。

(0 OR 0) -> 0 
(1 OR 0) -> 1 
(0 OR 1) -> 1 
(1 OR 1) -> 1 

 

    于是,并联开关的电路图就构成了计算机中OR操作(或门)的基本结构。当然,计算机中实际上还是通过两个继电器(或缓冲器)来实现的。 或门的符号为:

或门 

    

    三、NOT

    除去串联和并联,还有一种电路连接方式,叫做短路。

短路的开关 

    上面的连接方式中,当开关断开,灯泡点亮;当开关闭合,灯泡熄灭。其关联规则为

(0) -> 1 
(1) -> 0 

 

    这正是NOT运算符的运算规则。与AND、OR都需要两个输入不同,NOT运算符的输入只有一个。

(NOT 0) -> 1 
(NOT 1) -> 0 

 

    计算机中实现NOT运算符的电路叫做反转器,也就是将输入的信号取反输出。和与门、或门都需要两个两个继电器操作两个输入不同,反转器的实现只需要一个继电器。反转器的符号为:

反转器

    四、NAND 和 NOR

    前面的AND、OR和NOT三个运算符之间是可以组合的。如果反转器跟在与门的输出之后,就构成了“与非门”,其符号如下,运算规则就是将与门的输出反转。

与非门

(0 NAND 0) -> 1 
(1 NAND 0) -> 1 
(0 NAND 1) -> 1 
(1 NAND 1) -> 0 

 

    同理,如果反转器跟在或门的输出之后,就构成了“或非门”,其符号如下,运算规则就是将或门的输出反转。

或非门

(0 NOR 0) -> 1 
(1 NOR 0) -> 0 
(0 NOR 1) -> 0 
(1 NOR 1) -> 0 

 

    “与非门”和“或非门”都是需要两个继电器。

 

    五、半加器

    布尔代数中的AND、OR和NOT三个运算符、以及NAND、NOR两个组合运算符,是计算机可以通过继电器的电路连接就直接实现的。那通过这五个基本运算符,可以实现数学中最普通的加法运算么?

    首先,看一下加法的运算规则。

(0 + 0) ->  0 
(1 + 0) ->  1 
(0 + 1) ->  1 
(1 + 1) -> 10 

 

    我们可以把这个规则划分成两个部分:进位与求和。

    进  位           求  和    
(0 0) -> 0    (0 0) -> 0 
(1 0) -> 0    (1 0) -> 1 
(0 1) -> 0    (0 1) -> 1 
(1 1) -> 1    (1 1) -> 0 

 

    仔细看一下进位的规则,会发现与AND操作的规则完全一致。因此,通过一个实现AND操作的“与门”,就能实现加法中进位的处理。

    进   位            与   门 
(0 0) -> 0    (0 AND 0) -> 0 
(1 0) -> 0    (1 AND 0) -> 0 
(0 1) -> 0    (0 AND 1) -> 0 
(1 1) -> 1    (1 AND 1) -> 1 

进位的与门

 

    再来看求和的规则,与前面提到的几个规则都不一致,但我们可以通过前述规则的组合来实现:将一个“与非门”和一个“或门”分别作为“与门”的输入,看看运算结果:

((0 NAND 0) AND (0 OR 0)) -> (1 AND 0) -> 0 
((1 NAND 0) AND (1 OR 0)) -> (1 AND 1) -> 1 
((0 NAND 1) AND (0 OR 1)) -> (1 AND 1) -> 1 
((1 NAND 1) AND (1 OR 1)) -> (0 AND 1) -> 0 

 

    这个运算的结果与求和的规则完全一致。因此,我们只需要通过“与非门”、“或门”和“与门”的组合,就可以实现计算机加法中求和的处理,其电路图如下:

求和的电路

    对于这样复杂的基本操作,我们给他起了一个简单的名字:异或(XOR)。〔啊哈,好熟悉的名字。这个玄妙奇异的运算符,居然是从加法中诞生的。〕异或的符号如下:

异或

  

    现在我们把进位和求和两部分操作合并起来,就可以得到如下进行加法运算的电路图:

半加器

    现在的这个电路图被称为“半加器”(Half Adder),因为这里只有两个加数的输入,还没有考虑到更低位进行加法时提供的进位。

 

    六、全加器

    OK,再把更低位提供的进位作为第三个输入加入我们的计算器中。根据加法规则,我们将之前计算后的求和部分加上更低位的进位,这同样会产生一个进位和一个求和的结果。

增加低位进位

    啊哦,现在有两个进位要处理了。如果同时为1,岂不是要继续进位?

 

            来分析一下可能性。先假设两次运算的进位均为1。

            既然第二次运算的进位为1,就意味着低位进位和前一次运算结果的求和这两个数值必然都为1。

            而根据假设条件,第一次运算结果的进位也为1。

            那就是说,第一次运算结果的进位和求和都是1。

            这是不符合加法规则的。所以,假设不成立:-)

 

    舒了一口气,好在两个进位不可能同时为1。因此,我们最终计算出来的进位结果,应该是这两次进位的或操作(只要有一个进位为1,进位结果就为1)。再给两个进位进行一次OR操作,加上一个“或门”吧。

全加器

    现在的这张图被称为全加器(Full Adder),它在计算机中通过硬件实现了数学中最最基本的操作:加法。

    OK,总结一下。一个“与门”需要两个继电器,一个“或门”需要两个继电器,一个“反转器”需要一个继电器:一个“与非门”需要两个继电器,一个“异或”需要六个继电器,一个“半加门”需要八个继电器,一个“全加门”需要十八个继电器。如果要计算八位数相加的电路,就一个需要一百四十四个继电器了。

    继电器实在是太大了。幸运的是,随着技术进步,继电器早已经不在电脑中使用了。世界上的第一台电脑ENIAC就将继电器抛弃,改为了真空管,可仍然占用了170平方米的空间。现在,我们身边运行的电脑,都是使用晶体管代替了真空管。但计算原理仍然保持一致,计算八位数相加,仍然需要一百四十四个晶体管。

posted on 2010-02-15 21:48 香依香偎孤旅独行的驿站 阅读(...) 评论(...) 编辑 收藏