2.2 古怪的二进制计数法
坦率地说,我们要在这一节里讨论如何数数。比如,要是我问在图2.5中一共有几棵树,那么所有人都会说是十二棵。
图2.5 上面这些树的个数可以记做“12”
很简单,是吗?问题是,为什么我们要把十二写成“12”,而不是“#%”或者其他别的符号呢?老实说,就像对待电的问题一样,我们经常习惯于适应和被动接受,而不是问个为什么。
把十二棵树记做“12”,我们平时使用的这种方法叫十进制记数法。十进制计数法只有十个符号:0、1、2、3、4、5、6、7、8、9,但是却可以表示任意的数,比如一年有“365”天、月亮距离地球“384000”千米、珠穆朗玛峰的高度为“8844.43”米,等等。很显然,十进制记数法的奥秘在于组合,也就是用上面所列的10个符号来拼凑出各种不同的数。
十进制有10个符号,“9”是最大的。当要表示更大的数,比如十只烤鸭时,因为没有更多的符号可用,只能将“9”变成“0”,然后向左进一位,所以烤鸭的数量就可以记做“10”。如图2.6所示,当满十的时候就向前进位,这就是十进制记数法的由来。
图2.6 十进制是逢“十”进位的
2050年的一天,我在互联网上看到了一则报道,说是在神农架真的发现了野人。这个消息不胫而走,轰动一时,从那以后到神农架的人络绎不绝,为的都是一睹野人风采。
神农架位于湖北省西部靠近四川的位置,那里以神秘的原始森林著称,据说还有野人。但野人到底是什么样子,以前谁也没有真正见过。受好奇心的驱使,同时也因为那里离我的老家不远,我决定约我北京的朋友董宇和我一起前往神农架探个究竟。
正如网上所报道的,神农架里真的有野人部落存在。令人遗憾的是,由于这里每天都有数不清的旅游者,受他们的影响,我们已经看不到野人的原始生活状态了。
“感谢你们,”一个叫张三的“野人”对我们说,“在你们的帮助下,我们已经学会了外面的语言。但是有一个问题让我非常烦恼,你们俩能帮帮我吗?”
我们当然愿意为他提供帮助。在张三说明情况之后,我们才明白是怎么回事儿。原来他们尽管学会了汉语,但是对于计数一窍不通。
“我们现在是这样计数的,”张三说,“邻居李四前天来向我借米,我借给他了,账在这里。”说着他从一堆绳子里拿出一根来,指着上面的疙瘩,又拿起一只碗向我们晃了晃。
“他们是在用绳结计数,”董宇解释说,“绳子上打了5个结,他的意思是李四借了他5碗米。当然,如果米还了,他会把这些结解开。我认为我们应该帮帮他们,否则再这样下去,他就不用再待在这里,而是到武汉这样的大城市开绳子铺了。”
帮助人的确能够令人感到快乐,既然我们有能力做到这些,同时又能融入他们中间,那何乐而不为呢!
“野人”们的悟性真好啊,我只花了很少的时间就让他们明白了0和1。我在地上画一个圆圈,对他们说它的意思是“什么也没有”;然后又画一竖,说它代表的是一碗米。
这是一个非常好的开端,按照我的想法,用不了多久,“野人”们就能学会我们的计数方法。可是当我指着两碗米,在地上画了个“2”的时候,他们不干了。他们七嘴八舌,说是照这样下去,他们将不得不记住比碗里面的米粒还要多的符号。
“用不了那么多,你们只需要记住很少的几个就行了。”我对他们说道。同时挥挥手企图让他们平静下来,但根本无济于事。
这时董宇将我拉到一边,对我说:“你不要这样,这没有用。他们根本不会听你的,他们都是刚刚从蒙昧中走出来的人。他们不是已经知道0和1了吗?那么你就用这两样东西帮他们吧,我认为这应该是行得通的。”
这的确是行得通的,因为早在很多年前,我就曾接触过一种叫做二进制的记数方法。不像十进制,在这种方法里,只有0、1两个符号,如图2.7所示。为了同十进制有所区别,通常管这两样东西叫做“零”和“幺”。
图2.7 二进制的“零”和“幺”
既然是数数,那么任何记数方法都必须能表示“什么也没有”,或者“没有任何东西”。二进制也不例外,要是你把神农架的树都砍光了(你有没有这个胆量,这不是我们现在讨论的话题),这光秃秃的地方还会有多少棵树呢?我们这样表示(图2.8)。
图2.8 用二进制来表示“没有”
紧接着,张三种了一棵树,于是,现在神农架有了幺棵树(图2.9)。
图2.9 用二进制来表示十进制数“1”
这意味着,“幺”比“零”在数量上大一个级别。
要是张三又种了一棵树,那么,神农架现有的树木在十进制里就是“2”。不过,这种表示方法对于二进制来说行不通,因为它只有0和1,没有更多的符号。像十进制一样,二进制通过将1恢复到0,并向左进位来解决这个问题(图2.10)。
图2.10 二进制通过进位来表示更大的数字
于是,神农架当前的树木总数为(图2.11)。
图2.11 用二进制来表示十进制数“2”
注意,你要让头脑中的十进制思维暂时回避一下,不要被它干扰,这里是“幺零”,不是“十”。另外,很明显,这是“逢二进一”的,当计数到“2”的时候立即向左进位,这就是“二进制”的由来。
接着再种一棵树。这回,图2.11中的0增加到1,于是现有的树木可以表示为(图2.12)。
图2.12 用二进制来表示十进制数“3”
既然是通过种树来学习数数,继续种下去也无妨,那就再种一棵。种树容易,麻烦的是我们又遇到“逢二进一”的情况了。和前面一样,先是最右边的1回到0,向左进位。但是左边原来就有个1,它接受这个进位,也同样“逢二进一”,把自己恢复到0,然后继续向左进位。由于左边是空白,所以直接把进位放在空白处(图2.13)。
图2.13 用二进制来表示十进制数“4”
同样的方法,只需要细心点,再加上点儿耐心,再多的树也能数得过来(图2.14)。
图2.14 无论数量有多少,二进制都可以表示
以上就是我要向“野人”们传授的二进制记数法。不在现场,你都不知道我的处境。总之,整整一天,我都在竭尽全力地使他们明白这种记数方法,最要命的是根本不能按照我们平时的概念去向他们解释这一切,这让我感到非常费劲儿。好在他们非常聪明,很快就学会了这种记数方法。
尽管二进制记数法只有两个符号,但是却可以有无穷无尽的组合。可以这么说,任何一个十进制数,都有一个唯一的二进制数与之相对应。比如,月亮和地球之间的距离是384000千米,对应的二进制数就是1011101110000000000。问题是,你是怎么知道的呢?这里有一个笨办法和一个好办法。
笨办法需要大量的时间,而且容易出错,就是从0开始推演,推演到三十八万四千次的时候,结果就出来了。好办法呢,就是用一个公式,在十进制和二进制之间来回换算,既快又准确。关于这套公式,互联网上有很多相关的教程,书店里也有很多讲述二进制的书籍,这里就不做介绍了。表2.1给出了一些常见的十进制—二进制数对照表,这对于顺利阅读本书来说已经足够了。
表2.1 常见的十进制—二进制数对照表