概述:
- 什么是二进制,为什么使用二进制,布尔逻辑
- 三个基本操作:NOT AND OR 非 与 或
- 解释三个基本操作
- XOR 异或
今天我们开始抽象的旅程
不用管底层细节,把精力用来构建更复杂的系统。 上一篇教程,我们介绍了计算机最早是机电设备(electromechanical devices) 一般都是用十进制计数的,比如用齿轮数来代表十进制。再到晶体管计算机,幸运的是,只用开和关两种状态就可以代表信息,(and fortunately, even with just two states of electricity, we can represent important information.),我们叫这种表示为二进制(we call this representation Binary)意思是“用两种状态表示” (which literally means “of two states”)。就像自行车有两个轮子,双足动物有两条腿,你可能觉得两种状态不多,嗯,你说对的。
但是如果只需要用来表示true和false,两个值就够了。电路闭合,电流通过,代表“真”,电路断开,无电流流过,代表“假”。二进制也可以写成1或0,而不是true和false。只是不同的表达方式罢了。我们下个教程会讲更多细节。
晶体管的确可以不只是开或关,还可以让不同大小的电流通过,一些早期的电子计算机是三进制的,有三种状态。(TERNARY - 3 STATES)甚至五进制,五种状态(QUINARY - 5 STATES)。问题是,状态越多,越难区分信号。如果手机快没电了或者附近有电噪声,因为有人在使用微波炉,信号会混在一起。而每秒百万次变化的晶体管会让这个问题变得更糟。所以我们把两种信号尽可能分开,只用开和关两种状态,可以尽可能避免这类问题。计算机使用二进制的另一个原因是:有一整个数学分支存在,专门处理“真”和“假”,它已经解决了所有法则和运算,叫做“布尔代数”(BOOLEAN ALGEBRA)。乔治.布尔(George Boole)是布尔二字的由来,是一名19世纪自学成才的英国数学家,他有兴趣用数学式子 扩展亚里士多德基于哲学的逻辑方法,(He was interested in representing logical statements that went “under, over and beyond” Arisotle’s approach to logic, which was, unsurprisingly, grounded in philosophy),布尔用逻辑方程 系统而正式的证明真理(truth)(Boole’s approach allowed truth to be systematically and formally proven, through logic equations.),他在1847年的第一本书“逻辑的数学分析”中介绍过,在常规代数里,你在高中学的那种,变量的值,是数字,可以进行加法和乘法之类的操作,但是在布尔代数中,变量的值是true和false,能进行逻辑操作,布尔代数中有三个基本操作:NOT, AND 和 OR。这些操作非常有用,我们来一个一个看:
NOT操作把布尔值反转,把true进行NOT就会变成false,反之亦然。我们可以根据NOT操作的输入和输出,做出相应的逻辑表:INPUT 和 OUTPUT。酷的地方是:晶体管可以轻松实现这个逻辑,上集说过,晶体管只是电控制的开关,有3根线:2根电极和1根控制线。控制线通电时,电流就可以从一个电极流向另一个电极,就像水龙头一样,打开水龙头,就有水出来,关掉水龙头,就没水了。就可以把控制线,当输入,底部的电极,当作输出,所以1个晶体管,有一个输入和一个输出,如果我们打开输入,输出也会打开,因为电流可以流过。如果关闭输入,输出也会关闭,因为电流无法通过。或者用布尔术语来说,输入为真,输出为真,输入为假,输出也为假,我们可以把这个做成“真值表”,这个电路没什么意思,因为它没做什么事,输入和输出一样,但是我们稍加修改,实现NOT,与其把下面那根线当作输出,我们可以把输出放到上面,如果打开输入,电流可以流过然后“接地”,输出就没有电流,所以输出是off。如果用水来举例,就像家里的水都从一个大管子流走了,打开淋浴一点水也没有。
如果输入是on,输出是off,当输入是off,电流没法接地,就流过了输出,所以输出是on。如果输入是off,输出是on。和NOT操作表一样,太棒了,我们做了个有点用的电路。我们叫它“NOT门”,之所以叫“门”,是因为它能控制电流的路径。
AND操作有2个输入,1个输出,如果2个输入都是true,输出才是true,否则是false。你可以想成是说真话,如果完全不说谎,才是诚实。举例,看如下这个句子,我叫Carrie Anne,而且我穿着蓝色的衣服,2个都是真的,所以整个是真的。就算把前后的顺序反过来,也依然是假。和上次一样,我们可以给“AND”做个表,为了实现“AND门”,我们需要2个晶体管连在一起,这样有2个输入和1个输出,如果只打开一个输入,不打开另一个输入,电流无法到output,所以输出是false。如果只打开另一个输入,也是一样的情况,电流无法到output。只有在两个输入都打开了,output才有电流。
最有一个是OR,只要2个输入里,其中有1个是true,输入就是true,只有两个输入都是false,OR的结果才是false。实现“OR门”除了晶体管还要额外的线,不是串联起来,而是并联。然后左边这条线有电流输入,我们用小拱门代表2条线没连在一起,只是跨过而已,虽然看着像是连在一起,如果两个输入都是off,电流无法通过,所以输出是off。如果打开其中任何一个输入开关,电流可以流过,输出是on,如果两个输入都是on,结果也是on。好,现在NOT门,AND门,OR门都搞定了。
我们可以进行一次抽象,抽象的画法表示:NOT门的画法是三角形前面有一个圆点,AND门用D表示,OR门用太空船表示,“D形状和太空船形状”不是标准的叫法,只是形象的表示说法而已,帮助记忆。
我们可以用这种方法表示他们,构建更大的组件,就不会变得很复杂。
晶体管和电线依然在那里,我们只是用符号来表示而已,除了前面提到的三个布尔操作,还有另外一个有用的布尔操作叫“异或” XOR(Exclusive OR)。XOR就像普通OR,但是有一个区别:如果2个输入都是true,XOR输出false。如果想要XOR输出true,一个输入必须是true,另一个必须是false。用晶体管实现XOR还是有点复杂的,但是我们可以展示一下怎么使用前面提到的3种门来做XOR门。我们有2个输入,A和B,还有一个输出。我们先放一个OR门,因为OR和XOR的逻辑表很像,只有一个问题是,当A和B都是true时,OR的输出和想要的XOR输出不一样,我们需要的是false。所以我们需要多加几个门,如果加个AND门,输入是true和true,输出会是true,这不是我们想要的。但是如果在AND的输出加个NOT门,就可以把true反转成false了。最后我们再加一个AND门,放在最后,然后AND门的两个输入,分来来自NOT和最原始的OR,AND会收到false和true,因为AND需要输入都是true结果才是true,所以如果A和B的输入都是true,最终输出结果是false,符合预期。
XOR是非常有用的,我们后面再说。因为超级有用,工程师给了它一个符号,一个OR门+一个笑脸。
重要的是,现在可以把XOR放入工具箱了,不用担心,XOR具体用了几个门,这几个门又是怎么用晶体管拼接的,或者电子是怎么流过半导体的。
再向上抽象,工程师设计处理器时,很少在晶体管的层面思考,而是用更大的组件,比如逻辑门或者逻辑门组成的更大的组件,我们后面会讲。就算是专业的程序员,也不用考虑逻辑是怎么样在物理层面实现的。
我们从电信号开始,到现在第一次表示数据,真和假,开始有点“计算”的感觉了。仅用这次讲到的逻辑门,我们可以构造一个机器,可以判断复杂的逻辑语句,比如:[我叫John] AND [下午5点后] OR[周末] AND [在水果店附近] 那么 John想买水果 = 真。 https://www.bilibili.com/video/BV1EW411u7th?p=3