1.3 为啥要用二进制
既然人类从远古时代就开始使用十进制数了,为啥还要用二进制呢?二进制有什么优势呢?下面我们一起走进二进制的世界。
1.3.1 人脑与电脑
通过人类的进化,以及人们长期的学习和训练,人脑的潜能可以被不断地发掘。吉尼斯世界纪录中记纸牌记得最多的是一名英国人,他只需看一眼就能记住54副洗过的扑克牌(一共有2808张牌)。还有人能记住圆周率小数点后的42,905位数字!可见,人脑的潜能是可以不断被挖掘的。
在生活中,人脑对很多事物都形成了条件反射,例如,对于数据10与9的大小,我们可以直接反应出10比9大。不过,由于没有通过相应的运算,仅凭人脑直觉反应得出的结果可能是不准确的。例如,对于像比较大的两个数99999999与100000000,要想看一眼就得出哪一个数据更大,就变得不太可能了,即使得出结论,可能也会有错误。为什么呢?这是因为数据的位数变多了,并且重复的数很多,人脑无法一下子反应出来。通常要数一下有多少位数,然后才能进行判断。
计算机(俗称的电脑)却不一样,对于任何操作,电脑都需要经过相应的运算,然后才能得出结果。不管是比较10与9,还是比较99999999与100000000,电脑都会按规定的算法进行运算,最后得出相应的结果。而电脑一旦得出结果,其结果肯定是准确的!
在电脑中,使用二进制来保存数据和编写程序。为什么选用二进制,而不选用人类已经熟练使用的十进制呢?
如果要让电脑使用十进制,首先,应该让电脑能识别出十进制中的10个数字。怎么识别10个数字呢?通常的考虑是,可以通过元器件中电压的高低水平来分别标识10个数字。假如最高电压为12V,那么10个数字中,每个数码可以分配的电压区间为1.33V,如图1-27所示。

图1-27
从图1-27可知,每个数之间的电压间隔小,如果外界干扰造成电压大幅变化,数据就不准确了(如本来电压为1.33V,可被识别为数字1,但是由于外界干扰,电压增加了1V,就变成2.33V了,这里距离2.67V更近,就可能被识别为数字2)。还有一个最大的问题,在硬件上要识别这10种状态,其电路结构将非常复杂。
当然,这里只是一种假设,实际应用中采用的是二进制。由于二进制数只有2个数码,电路就很简单了,因为具有两种稳定状态的元件(如晶体管的导通和截止,继电器的接通和断开,电脉冲电平的高低等)很容易被找到。
因此,在电脑中使用二进制主要有以下优点:
技术实现简单。电脑由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。
运算规则简单。两个二进制数的和、积运算组合分别有3种规则,相比十进制数的运算规则来说非常简单(十进制的九九乘法表就有81种规则),有利于简化计算机内部结构,提高运算速度。
适合逻辑运算。逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。
易于进行转换。二进制数与十进制数、八进制数、十六进制数之间的转换很方便。
抗干扰能力强。用二进制表示数据具有抗干扰能力强、可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高电平还是低电平(只分辨电平的高低,而不用识别具体电压值)。
知道电脑用二进制数来存储后,再来看电脑就简单了。电脑保存的数据用电路的两种状态表示,当数据很大时,只需要增加数据的位数就可以了。
当超大规模集成电路迅速发展起来后,电脑中就可以处理、存储海量数据信息了。并且,由电脑保存的数据保存周期长,不易丢失、损坏。而由于人类的认知及人的记忆会随时间出现遗忘等原因,要用人脑来存储、处理海量信息,就不太可能。
因此,很多人认为电脑比人脑强。其实,电脑本质上只能识别0和1这两种状态!而更复杂的功能,则是由人类对0和1这两种状态进行各种组合而得到的。
1.3.2 二进制计数规则
二进制的计数规则非常简单,只需要记住以下3点就行了:
基数为2。
只有2个数码,即0和1。
逢2进1,借1当2。
如图1-20所示,十进制数可以由多位组成,从右向左分别为个位、十位、百位、千位、万位……,与此类似,二进制数也可由多位组成,从右向左分别为1位、2位、4位、8位、16位……,如图1-28所示。

图1-28
为什么称为1位、2位、4位、8位……呢?其实,这是从十进制角度来看二进制的各位数得出的名称。根据二进制计数的规则,用二进制计数时,第一个数为0,第2个数为1(根据逢2进1的规则),接下来为10(所以第2位就是“2位”),继续下来依次为11、100(所以第3位就是4位)、101、110、111、1000……。
如表1-1所示是十进制数0~127用二进制表示的对应形式。从表1-1中可以看到,当十进制数为0和1这两种情况时,可用1位二进制来表示这两种状态;当十进制数在7以内时,可以使用3位二进制数来表示——随着十进制数的增大,对应的二进制数的位数也会增多,在表1-1中表示到十进制数127时就需要7位二进制位来表示了。
表1-1 十进制数0~127对应的二进制表示

1.3.3 简单的二进制运算规则
与十进制数的运算规则相比,二进制数的运算规则就简单多了。同样,二进制也可对数据进行加、减、乘、除这些基本的算术运算,另外,二进制数据还可进行逻辑运算。有关逻辑运算的内容需要另一个主题来介绍,下面先来看看二进制的算术运算是多么的简单。
1.加法
与十进制的加法相比,二进制的加法规则要简单得多。如果只考虑一位数相加的情况,在十进制加法运算中,加数和被加数都有0~9共10种可能,因此,会产生100种可能的情况(即使根据加法交换律将重复的运算过滤掉,也会有55种情况)。而二进制加法运算中,加数和被加数都只有两种可能,因此,只会有以下4种情况:

根据加法交换律,将第2、3种运算看作为一种运算,则二进制的加法运算就只有3种情况了。3比55!二进制的加法运算规则是不是要简单得多!
对于多位数的二进制相加,其运算规则与十进制相同,仍然会有进位的情况,只是进位时采用“逢2进1”的方式。例如,将十进制数25加上38,根据表1-1找出对应的二进制数,即可列出如图1-29所示的十进制数与二进制数加法的竖式。

图1-29
在图1-29所示的两种进制的加法运算中,左侧的十进制运算是按“逢10进1”的方式进位,右侧的二进制运算则是按“逢2进1”的方式进位。虽然是两种不同的数据表示方式,但运算的结果是一致的(十进制数65对应的二进制数为1000001)。
2.减法
二进制的减法运算规则也很简单,只有以下4种可能:

如图1-30所示为十进制和二进制减法的竖式,在运算时注意十进制是“借1当10”,而二进制则是“借1当2”。

图1-30
3.乘法
十进制数的乘法运算需要按“九九乘法表”法则进行,而二进制乘法的规则就简单多了,与加、减类似,也只有以下4种情况:

可以看出,只有当被乘数、乘数都为1时,结果才为1;当被乘数或乘数有一个为0时,相乘的结果就为0。
另外,二进制的乘法运算可以很简单地转化为加法运算。首先看如图1-31所示的乘法竖式,左边是十进制的乘法竖式,右边是二进制乘法竖式。

图1-31
从右侧的乘法竖式可看出,当乘数某位为0时,这一位与被乘数相乘时各位都为0,当乘数某位为1时,这一位与被乘数相乘时得到的是被乘数对应的各位,只是需要将被乘数向左移动相应的位数。这样,二进制数的乘法就可以很简单地转化为“加法与移位”。
4.除法
除法是乘法的逆运算,既然二进制的乘法表只有4项,则其除法表也对应有如下4项(其中除以0是无意义的):

看看图1-31中乘法的逆运算,如图1-32所示。

图1-32
从图1-32中可看出,二进制的除法运算也可简单地转化为“减法与移位”操作。
可以看出,在二进制中,加、减、乘、除算法都可转换为加法运算。对于减法运算,只需要将被减数设置为负数,就可将其转换为加法;对于乘法,则可使用“加法与移位”操作来完成;对于除法,则可使用“减法与移位”操作来完成。
既然比较复杂的乘法和除法运算能简单地转化为加、减法和移位操作,因此,电脑中就只需要设计一个加法器即可,这样就简化了电路设计。
1.3.4 二进制数的分解
在前面的二进制计数规则中曾说过,二进制数从右向左依次为1位、2位、4位、8位……,这是指二进制数中各位的意义。虽然只有0和1这两个数码,但是其所处的位置不同,表示数据的大小也不同。例如,有以下二进制数:

这个二进制数共有4位,由3个1和1个0组成。同样的3个1,由于其处于不同的位置,这些1所表示的大小也是不同的,其所处的位置称为权。按从右向左的顺序各位的含义如下:
第1个1表示“1的个数”;
第2个1表示“2的个数”;
第3个0表示“4的个数”;
第4个1表示“8的个数”。
因此,二进制数1011由1个8、0个4、1个2、1个1组成。按各位的权列出的算式如下:

从这种按权展开式可看出,每个位的“权”表现为2的幂次关系,即相邻两位相同数码代表的值为2倍的关系(从右向左看,第2位的1是第1位的1的2倍)。
这种按权展开式可方便地将二进制数转换为十进制数。
1.3.5 十进制数转换为二进制数
将二进制数按权展开,就可以方便地将其转换为十进制数。那么,十进制数该怎么转换成二进制数呢?
十进制整数转换为二进制整数通常采用“除2取余,逆序排列”法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
例如,将十进制数14转换为二进制数时,“除2取余”的转换过程如图1-33所示。

图1-33
通过图1-33所示的逐项除2取余方式,得到每次除以2的余数,最后将取得的余数按逆序排列,即将十进制数14转换为二进制数1110。将这个二进制数按权展开,又可得到十进制数14。

