第8章 十的替代品
对于我们人类而言,10 是一个非常重要的数字。10 是我们大多数人拥有的手指或脚趾的数目,当然我们也希望所有人的手指和脚趾都是 10 个。因为手指非常便于计数,于是我们人类已经适应了这个以 10 为基数的数字系统。

就如前面章节中所提到的,我们现在所用的数字系统是基于 10 的数字系统的,或称为十进制。我们已经非常习惯这个数字系统了,因此起初也很难再构想出其他的数字系统。的确,当我们看到数字 10 的时候,我们不自觉地就会想到这个数字代表了下面这么多只鸭子:

但是,数字 10 之所以指的是这么多只鸭子,其唯一理由就在于这些鸭子的数目与我们的手指数目相同。如果人类的手指不是 10 根,我们数数的方式就会有所不同,那么 10 就会是另外一个含义。同样,数字 10 可以代表这么多只鸭子:

或者是这么多只的鸭子:

甚至可以是这么多只的鸭子:

当我们认识到,10 可以表示两只鸭子,我们就可以解释开关、导线、灯泡和继电器(进一步推广到计算机)是如何表示数字的了。
如果人类像卡通人物那样每只手有 4 根手指会怎样呢?我们可能就不会想到建立一个以 10 为基数的数字系统。相反我们会自然而然地、不可避免地想到建立一个以 8 为基数的数字系统。我们就不会称这个系统为十进制数字系统,而称之为八进制数字系统。
如果我们的数字系统是以 8 为基础而建立的,我们就不需要如下这个符号:
将这个符号给卡通人物看的话,你会得到这样的反应:“这是什么?它代表什么?”如果继续仔细考虑一下,你会发现我们连这样的一个符号也不会需要:
在十进制中,10 没有特定的符号,因此在八进制中,同样也没有表示 8 的特定符号。十进制中我们的计数方式是:0、1、2、3、4、5、6、7、8、9,然后是 10。在八进制中数字系统中计数方式是:0、1、2、3、4、5、6、7,而后是什么呢?我们已经将符号用完了。在这里唯一有意义的只有 10,而在这里的正确答案恰恰就是 10。在八进制中,7 之后的下一个数字是 10。但是这个“10”代表的并不是人类手指的数量。在八进制中,“10”代表的是卡通人物手指的数量。

如果继续用脚趾数下去的话,就是这样:

使用非十进制的数字系统时,你可以将“10”读作“一零”,这样可以避免一些混淆。类似地,“13”读作“一三”,“20”读作“二零”。要想真正避免混淆,可以将“20”读作“基于8的数二零”或“八进制二零”。
尽管已经用完了所有的手指和脚趾,但我们仍能够用八进制继续数下去。这与十进制基本相同,但是我们跳过了数字8和9。当然,相同数字所代表的数量是不同的:
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22,
23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43,
44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64,
65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 77, 100…
这里最后一个数字我们读做“一零零”。这是卡通人物手指的数量自身相乘所得的结果。
当书写十进制和八进制数时,我们可以利用下标标注来区别不同数字系统,避免混淆。下标TEN表示十进制,EIGHT表示八进制。
当书写十进制和八进制数时,我们可以利用下标标注来区别不同数字系统,避免混淆。下标
这样,白雪公主遇到的小矮人数量是
卡通人物的手指数是
正常人类的手指数是
贝多芬所写的交响曲的数目是
人类手指的数量是
一年中的月份数是
两个星期的天数是
“情人”的生日庆祝会是
一天中的小时数是
拉丁字母表中的字母数是
一夸脱的液体相当于的盎司数是
一副纸牌的张数是
棋盘的格数是
日落大道上最有名的地址是
美式足球场地的面积是
温网首届女子单打的初赛人数是
孟菲斯市的面积是
注意,在上面一系列的八进制数中出现了几个好整数(nice round number),如
你可能还会注意到,这些好整数
这是非常有意义的。例如,
下表给出了一些2的整数次幂的十进制及其对应的八进制的表示形式。
最右列的好整数暗示我们,十进制以外的数字系统可能对使用二进制码有所帮助。
在结构上,八进制数字系统与十进制数字系统并没有什么不同。它们只是在细节上存在一些差异。例如,八进制数中的每个位所代表的值是该位数字乘以8的整数次幂的结果。

这样,一个八进制数
同样还可以写成若干种不同的形式,下面是利用十进制的8的整数次幂写出的一种形式:
采用八进制形式的8的整数次幂,表现形式如下:
还有一种拆分形式:
如果用十进制数计算出结果,会得到
我们可以像进行十进制数的加法和乘法那样,对八进制数进行加法或乘法运算。不同的是,我们要采用不同的表来对各个数位进行乘法或加法运算。下面是八进制数的加法表。
例如,

首先要从最右的一列开始,5加3等于10,结果为0,进位1;1加3加4等于10,结果为0,进位1;1加1加6等于10。
同样,在八进制中,2乘以2结果依然为4。但是3乘以3却不等于9。那是多少呢?在这里,3乘以3结果是
在这里,4 × 6等于
八进制数字系统与十进制数字系统一样,都是有效的。但是让我们更进一步来看,既然已经为卡通人物开发了一套数字系统,就让我们再制订一套适合龙虾的数字系统吧。实际上龙虾根本没有手指,但是在它们前爪的末端都有螯。适用于龙虾的数字系统是以4为基数的四进制(quaternary)数字系统。

四进制数字系统是像这样计数的:0,1,2,3,10,11,12,13,20,21,22,23,30,31,32,33,100,101,102,103,110,等等。
这里我不打算在四进制数上花太多的时间,因为接下来我们即将转入一个更为重要的话题。通过下图我们可以看出四进制中每一位是如何跟4的某个整数次幂相对应的。

四进制数
等价于:
同样可以写成:
如果以十进制数的形式计算其结果,我们会发现
现在,我们要做一个跳跃并且是最远的一跳。如果我们是海豚,那么就必须用两个鳍来计数。这个数字系统称为以 2 为基数的数字系统,或二进制。这样的话我们似乎只有两个数字了,这两个数分别为 0 和 1。
0和1现在已不是我们要处理的全部问题了,而我们还需要练习一下才能习惯使用二进制数。二进制数最大的问题是数字用完得很快。例如,下图就是海豚如何用它的鳍来计数的例子。

是的,在二进制中,1 的下一个数字是 10。这让人惊讶,但也并不是什么意外。无论使用哪种计数系统,当单个的数字用完时,第一个两位数就是 10。二进制系统这样计数的:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100,
1101, 1110, 1111, 10000, 10001…
这些数看起来似乎很大,但实际上并不是这样的。准确地说,二进制数的长度增长得很快而非数值增大得快:
人类的头的个数是
海豚身上鳍的个数是
一个大汤匙中的小茶匙的数目为
正方形的边数是
人类一只手的手指数是
昆虫的腿数是
一周中的天数是
八重奏中演奏者的人数是
银河系中行星(包括冥王星)的总数是
牛仔帽的重量以加仑计算为
在一个多位二进制数中,数字的位置和2的整数次幂的对应关系为:

因此,任何一个以 1 开头而后面全是 0 的二进制数,一定都是 2 的整数次幂。幂指数就等于这个二进制数中 0 的个数。
以下是 2 的各整数次幂的扩展表,它可以用来说明这条规则。
假定有一个二进制数
同样也可以用下面这种方式表示:
如果将各个部分以十进制数的形式相加,会得到
为了更简明、更便捷地将二进制数转换为十进制数,你可能会更喜欢借助我准备的模板来进行转换:

这个模板可以将一个数转换最大长度为8的二进制数,但是它很容易扩展。在使用模板的时候,将8位二进制数填入到上面一行的格子里,每个格子一位。做8个乘法运算,然后将结果填入到下面一行的8个小格子里。再将这8个格子中的数相加就会得到最终结果。下面就举例说明如何得到与二进制数

将十进制数转换成二进制数就没那么直接了。下面是一个能够帮你将 0~255 范围内的十进制数转换为二进制数的模板。

这个转换实际上比看上去要麻烦得多,因此一定要仔细地按照下面的指导来操作。将整个十进制数(小于或等于 255)填入到上面一行最左端的格子中。用第一个除数(128)去除这个数。所得的商填入正下方的格子(左下角的格子),余数填入右边的格子(上面一行左数第二个格子)。用第一个余数再除以下一个除数 64。依照模板的顺序用同样的方法继续进行下去。
要记住,每次求得的商只能是 0 或者 1。如果被除数小于除数,商为 0,余数就是被除数。如果被除数大于或等于除数,那么商为 1,余数就是被除数减去除数所得之差。下面以 150 为例进行转换。

如果需要对两个二进制数进行加法或乘法,直接运算可能会比转换成十进制再进行运算要简单些。这将是你真正喜欢二进制数的地方。想象一下,如果你记住了如下表格,掌握加法将是一件多么迅速的事情啊。
让我们用这个表格来计算两个二进制数的和:

从最右一列开始:1 加 0 等于 1。右边第二列:0 加 1 等于 1。第三列:1 加 1 等于 0,进 1。第四列:1(进位) 加 0 加 0 等于 1。第五列:0 加 1 等于 1。第六列:1 加 1 等于 0,进 1。第七列:1(进位) 加 1 加 0 等于 10。
乘法表甚至比加法表还要简单,因为该表可以由两个基本的乘法规则推导出来:任何数乘以 0 结果都为 0,任何数乘以 1,结果都是这个数本身。
以下是

结果为
人们在使用二进制数的时候通常将它们写成带有前导零的形式(即第一个 1 的左边有零)。例如
让我们再看一下这一列二进制数。仔细考虑这 4 个垂直列中每一列的 1 和 0,注意它们在一列中自上而下是以怎样的规律交替的。
- 最右边的一列一直在 0 和 1 之间交替。
- 右数第二列是在每两个 0 和两个 1 之间相互交替。
- 下一列是在每四个 0 和每四个 1 之间相互交替。
- 再下一列是在每八个 0 和每八个 1 之间相互交替。
这是很有条理的,难道不是么?事实上,只要再重复这 16 个数字并且在每个数字的前面加一个 1 就可以很容易地写出后面的 16 个数字。
从另外一种角度来看:当以二进制计数的时候,最右边的一位(最低位)以 0 和 1 交替。每当该位由 1 变为 0,从右边数的第二位(次低位)也随之改变——不是由 0 变到 1,就是由 1 变到 0。因此,每次只要有一个二进制数位的值由 1 变到 0,紧挨着的高位数字也会发生变化,而且其变化不是由 0 到 1 就是由 1 到 0。
在书写一个比较大的十进制数的时候,通常在每三位数字之间用一个逗号隔开,这样会让人很清楚地读出数字的大小。例如,当你看到数字 12000000 时,你可能不得不去数一下其中 0 的个数才知道这个数是多少,但是,如果数字写做 12,000,000,你一眼就会知道它是一千二百万。
二进制数的位长度增加得特别快。例如,一千二百万在二进制中应表示为:
101101110001101100000000。为了让二进制数更易读,通常在每四个数字之间用一个连字符来分开,例如,1011-0111-0001-1011-0000-0000,或者每四位空出一个空格:1011 0111 0001 1011 0000 0000。本书的后面,我们将看到更简单的二进制数的表示方法。
通过将数字系统减少至只有 0 和 1 两个数字的二进制数字系统,我们已经讨论得足够深入。不可能再找到比二进制数字系统更简单的数字系统了。此外,二进制数字系统还在算术与电子技术之间架起了一座桥梁。在之前的章节中,我们所看到的开关、电线、灯泡,还有继电器等物体,都可以用来表示二进制数 0 和 1。
电线可以表示二进制数字。如果有电流流过这根电线就代表二进制数字 1,如果没有,则代表二进制数字 0。
开关可以表示二进制数字。如果开关接通(或闭合)就代表二进制数字 1,如果开关关断(或断开),则代表二进制数字 0。
灯泡可以表示二进制数字。如果灯泡点亮,就代表二进制数字 1,如果没点亮,则代表二进制数字 0。
电报继电器可以表示二进制数字。如果继电器闭合,就代表二进制数字 1,如果断开,则代表二进制数字 0。
二进制数与计算机之间有着紧密的联系。
大约在 1948 年,美国数学家约翰·威尔德·特克(John Wilder Turkey,生于 1915 年)就意识到随着计算机的普及,二进制数很可能会在未来发挥更重要的作用。他决定创造一个新的、更短的词语来代替使用起来很不方便的五音节词——binary digit。他曾经考虑使用 bigit 和 binit,但是最终他还是选用了这个短小、简单、精巧而且非常可爱的词——bit。
