二进制
二进制来自哲学,自然万物两两相对,白天与黑夜、太阳和月亮、苍天与大地、男人和女人、寒冷与炎热、甘甜和苦涩……我国传统文化中的阴阳学说、太极八卦,都是在讲这些自然的本质。
不光中国,在很久很久以前,世界各地的文明也都或多或少意识到了二进制的意义,只是除了参悟哲学道理,一直没有用到数学中去。
直到17~18世纪,数学上的二进制才由莱布尼茨首次提出。莱布尼茨首先是位伟大的哲学家,至简的理念始终贯穿在他的哲学和数学研究中。他认为,任何数字都可以在0和1的基础上产生。他对中国的哲学文化有着十分浓厚的兴趣,当了解到《易经》时,不禁感叹其中充满智慧的符号系统和他的二进制理论竟如此相仿[1]。
那么,“逢2进1”的二进制如何表示数字呢?我们知道,对于一个十进制数,从最右侧的个位开始,越往高位,数位上的数字所代表的值越大,相邻数位上相同的数字所代表的值相差10倍。比如1024中,个位上的4代表3,十位上的2代表20,千位上的1则代表1000,用数学语言表达就是:
总结而言,就是从右往左数,第n位上的数字所代表的值,是该数字与10n-1的乘积。二进制示数也遵循这一规则。对于一个全是1的二进制数,从右往左,第1位表示20,第2位表示21,第3位表示22,第4位表示23,第5位表示24,以此类推,第11位表示210,即1024。
下表罗列了部分常用的二进制数,在计算机领域,为了方便阅读和处理,常常会以4位为单位在二进制串前补零。
十进制数 | 二进制形式 | 补零后的二进制形式 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 10 | 0010 |
3 | 11 | 0011 |
4 | 100 | 0100 |
5 | 101 | 0101 |
6 | 110 | 0110 |
7 | 111 | 0111 |
8 | 1000 | 1000 |
9 | 1001 | 1001 |
16 | 1 0000 | 0001 0000 |
32 | 10 0000 | 0010 0000 |
64 | 100 0000 | 0100 0000 |
128 | 1000 0000 | 1000 0000 |
256 | 1 0000 0000 | 0001 0000 0000 |
512 | 10 0000 0000 | 0010 0000 0000 |
1024 | 100 0000 0000 | 0100 0000 0000 |
莱布尼茨还设想过一种可以进行二进制加法的机械计算器,这种机器需要有一排可以开闭的洞口,洞口打开表示1,洞口关闭表示0,通过往洞中扔小弹珠表示加法,每个洞中最多只能存放1颗弹珠,每满2颗它们就会一起从机器中滚出来,洞口也相应关闭,高一位洞口则打开。
布尔代数
莱布尼茨坚信,人类的思想和数字一样可以化繁为简——所有思想都可以分解为数量不多的简单思想。这些简单思想通过一些既定规律,可以组成任意的复杂思想,就像数学运算一样。当两个人发生了争执,他们可以把自己的观点通过数学计算的方式梳理出来,谁对谁错就一目了然了。
为了“计算”思想,莱布尼茨阐述了后来被称为合取(conjunction)、析取(disjunction)、否定(negation)等的逻辑运算规则,成为数理逻辑(mathematical logic)最早的探索者之一。
但逻辑运算在数学上的系统性定义,要等到19世纪由英国数学家乔治·布尔(George Boole)首次提出。布尔分别在1847年和1854年发表了著名的《逻辑的数学分析》和《思维规律的研究》,将数学中的代数方法引入到逻辑学中,被后人称为布尔代数(Boolean algebra),逻辑运算因而也叫布尔运算。
下面通过一个例子介绍简单一下逻辑运算,假设有X、Y两个命题。
X:乔治·布尔发明了二进制。
Y:乔治·布尔创立了布尔代数。
显然,X命题是错的,Y命题是对的。在逻辑学中,我们称:X命题为假,Y命题为真。如果用连词将X、Y两句话连起来说呢?
比如:乔治·布尔发明了二进制且创立了布尔代数。这句话是错的,即“X且Y”的组合命题为假。
再比如:乔治·布尔发明了二进制或创立了布尔代数。这句话是对的,即“X或Y”的组合命题为真。
这就是逻辑学中的合取与析取,也称逻辑与和逻辑或。
当然,也有对单个命题的逻辑运算,比如:乔治·布尔没有发明二进制。这句话是对的,即“非X”为真。
这就是逻辑学中的否定,也称逻辑非。
与、或、非是3种最基本、最常用的逻辑运算。将它们组合起来,还可以形成与非、或非、异或、同或等复杂逻辑运算。历史上,布尔和许多其他逻辑学家曾使用过各种层出不穷的符号来表示它们,如今,我们常用下表中的表达形式。
逻辑运算 | 英文缩写 | 表达式 |
---|---|---|
与 | AND | |
或 | OR | |
非 | NOT | |
与非 | NAND | |
或非 | NOR | |
异或 | XOR | |
同或 | XNOR |
其中,异或和同或其实意如其名,只是表达式有点抽象,它们的展开式十分容易理解:
而逻辑命题的真假像极了二进制中的1和0,布尔代数自然而然选择用1表示真、0表示假。
经过简单的逻辑推演,我们就能得到这些逻辑运算在所有情况下的结果:
X | Y | 与 | 或 | 非X | 与非 | 或非 | 异或 | 同或 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
不难发现,逻辑运算和二进制运算有着极高的一致性,除了有点违反直觉的:
更巧合的是,逻辑运算和数学运算一样满足交换律、结合律和分配律等各种运算规则,比如:
数字电路
20世纪,随着继电器电路的发展,许多科学家开始将二进制、布尔代数和电路联系到一起,最终,由美国一位名为克劳德·香农(Claude Shannon)的数学家做出了完整阐释。1938年,就读于麻省理工学院的香农发表了他那篇著名的硕士论文《继电器与开关电路的符号分析》,奠定了数字电路的理论基础。
开关电路就是有接通和断开两种状态的电路,继电器电路就是一种典型的开关电路。当我们用X、Y等字母表示开关电路,将两者串联就可以表示逻辑与,将两者并联就可以表示逻辑或。
那么逻辑非如何如何实现呢?还记得有两个静触点的电磁继电器吗?如果X表示常闭触点所在的工作电路,便是常开触点所在的工作电路,两者的通断永远互斥。
有了与、或、非3种基础逻辑电路,异或等复杂逻辑电路也就不难搭建了。
如此一来,电路就彻底数字化了,原本物理的连接可以用数学来表示,是为数字电路。香农认为,基于布尔代数,再复杂的电路都可以用表达式条理清晰地设计出来,更重要的是可以等效化简。香农的研究成为后来二进制机电计算机和电子计算机强大的理论支柱。
逻辑门
逻辑电路发展成熟后,工程师们更多地把它们作为一种电路中的元器件(而不是电路本身)使用。他们不关心这些元器件的内部实现,更关注当代表0或1的信号从它们的输入端进去,从输出端出来的是0还是1。这种通过逻辑电路实现二进制信号转换的元器件称为逻辑门(logic gate),门的概念很形象,二进制数据可以从门通过,也可能被门挡住,庞杂的计算机电路正是靠着一扇扇这样的门组合而成的。下图为IEEE和IEC[2]标准中规定的逻辑门符号,统一的矩形表示更有利于绘制复杂的集成电路,信号从矩形左侧进入,从矩形右侧输出。
组合逻辑电路
逻辑门像一块块标准化的积木,我们可以用这些积木灵活地搭建出实现各种功能的组合逻辑电路。举个最简单的例子——二进制加法器。要实现两个二进制数的相加,首先要实现单个数位的两两相加。用A和B表示两个二进制数某一位上的值,Cin表示来自低位的进位值,S和Cout表示A+B+Cin之后该位的值和向高位产生的进位值,得单数位的加法真值表:
A | B | Cin | S | Cout |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
用2个异或门和3个与非门即可实现这一逻辑,有兴趣的读者可以取几组值验证一下。二进制数有多少位,就需要多少个图中的逻辑电路,相邻数位的低位Cout与高位Cin相连,最低位的Cin永远为0。
减法以及其他更复杂的运算,乃至控制逻辑也可以如法炮制。
最重要的是,开关电路仅仅是逻辑电路的实现途径之一,其实不论任何材料,所组成的基础元件只要能表达出两种状态、能在两种状态之间切换,并能将状态传递给其他基础元件,都可以用来实现逻辑电路以及逻辑门。逻辑门一旦实现,二进制计算机的建造就像搭积木一样简单了。这种基础元件的等效性,是可以用不同材料来建造计算机的本质原因。在本章,我们甚至会见到纯机械的逻辑门,那是建筑二进制计算机的第一批积木,它们尚与电路和电子无关,而是由钢铁制成的。
参考文献
- Wikipedia. Gottfried Wilhelm Leibniz[EB/OL].
- Daniel R L. Development of the Binary Number System and the Foundations of Computer Science[J]. The Mathematics Enthusiast, 2014, 11(3):513-540.
- Boole G. The Mathematical Analysis of Logic[M]. New York: Philosophical Library, 1948.
- 黄耀枢. 布尔与布尔代数[J]. 自然辩证法研究, 1985(4):36-43.
- Wikipedia. Claude Shannon[EB/OL].
- 百度百科. 克劳德·艾尔伍德·香农[EB/OL].
- Shannon C E. A Symbolic Analysis of Relay and Switching Circuits[D]. Boston: University of Michigan, 1938.
- Wikipedia. Logic gate[EB/OL].