从十进制数谈到巴比伦数字系统

我们的计数方式

生活中我们普遍使用十进制进行计数。我们生下来不久就被老妈教着数手指头。没错,我们刚好十根手指头,用来计算方便极了。十进制很早就刻入了我们的脑海,以至于我们不需要知道这是十进制就可以计算早上买了一个面包,老板要找我多少钱。为什么用这个例子呢?聪明的你一定可以想到最早的计数就是用于交易的。早期的物物交换也得有个数吧,不然就乱了。

嗯,除了这种用10个符号(0到9)计数的,我们还接触过12生肖,接触过1天24小时,1分钟60秒,1 兆 1024 个。这些可不是十进制哦。那这些算是什么呢?这得从数字系统讲起。

数字系统

所谓数字系统就是确定如何用有限的符号来表示一个数字。数字或者说数量是现实存在的且不会因为所用的数字系统不同而改变,你可以用十进制的 2 来表示两个苹果,也可以用二进制的 10 来表示,这丝毫不会影响苹果的数量。这里的”2”和”10”都只是符号而已,只是为了描述的方便而产生。

数字系统有两种,一种是位置化数字系统,另一种是非位置化数字系统。我们常用的是位置化数字系统,这里主要阐述的也是位置化数字系统。
所谓位置化,是指符号因所处的位置不同所表示的值也不同。你想啊,把 2 放在个位它就是 2 ,但是放在十位不就是 20 吗?这里的 20 后面有个 “0” !!!这太重要了,如果没有 “0” ,位置化数字系统会变得有点尴尬,这点后面讨论就会感受到。

先谈谈十进制

十进位是古印度人的发明,他们在公元前3世纪就有了这种计数方法。但是那时候还没有用阿拉伯数字表示,也没有 “0”。直到传入阿拉伯,善于经商的阿拉伯人改造了它,从此贸易就变得简单多了。再后来传入欧洲,而欧洲人误以为这是阿拉伯人的发明,就称之为 “阿拉伯计数法” 了,我们现在通常说的阿拉伯数字,其实就是欧化了的阿拉伯数字。

“0” 的发明太重要了,要单独谈谈。零最初是印度人发明的,公元8世纪左右就有了用点表示的零,而圆形的零出现于公元13世纪。【世界古文明,张新国】其实公元6世纪,印度天文学家瓦拉哈就对零进行了加减运算。此后传入阿拉伯才有了真正的十进制数字系统。为什么等到公元6世纪才有零的发明呢?明明十进位计数法在公元前3世纪就有了!据说是因为那时候印度大乘佛法倡导”空”的思想,在这个背景下,才有了零的含义和表示。然而,印度人并不只是认为零是空无,还承认它是一个数。这很重要,承认它是一个数,它才有资格参与运算,而不是作为填补空格的记号。

说回十进制,十进制的科学定义是:10为底的用10个字符表示一个数的系统,字符集是S={0,1,2,3,4,5,6,7,8,9}。

一个数可以表示成 $\pm(S_{k-1}\cdots{S_{2}}{S_{1}}{S_{0}}{S_{-1}}{S_{-2}}\cdots{S_{-l})_{10}}$

但是为了方便我们通常省略+号、括号和底。

其值得计算方式是:

$N = \pm(S_{k-1}\times10^{k-1}+S_{k-2}\times10^{k-2}+\cdots+S_{2}\times10^{2}+S_{1}\times10^{1}+S_{0}\times10^{0})$

嗯,$233 = 2\times10_{2}+3\times10^{1}+3\times10^{2}$

这就是十进制的故事。然而十进制对于计算机来说是不理想的,虽然对人类来说是友好的,因为人类有十根手指头,而计算机中只有电路的开关两种状态,让它用十进制计算似乎不科学。

二进制登场

于是乎二进制登场了。据说将二进制利用于计算机的人是借鉴了中国的阴阳学说。中国人用阴阳表示了世间万物,而计算机用”0”、”1”表示了所有的数据,这其中的奥妙值得细细体味。

仿造十进制的定义,我们给出了二进制的科学定义:使用2为底的2个字符表示一个数,字符集S = {0,1}。其计算方式与上面的可类比,其实就是把10换成了2。比如 $(101)_{2} = 1\times2^{2}+0\times2^{1}+1\times1^{0} = (5)_{10}$

你看一个十进制的5,用二进制表示就用了3位。想想要是十进制的100呢?岂不是一长串的01组合。聪明的人类肯定不喜欢这样,于是发明了八进制和十六进制来简化二进制的书写。

所谓的八进制是这样的:使用8为底的8个字符来表示一个数,字符集S = {0,1,2,3,4,5,6,7}。注意:只能使用字符集里面的字符来表示数,”8”,”9”在这里是没有意义的。$(8)_{10} = (10)_{8}$ , $(9)_{10} = (11)_{8}$。

所谓的十六进制是这样的:使用16为底的16个字符来表示一个数,字符集S = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}。后面之所以用字母表示,是因为十进制的字符不够用了,如果你由你来定义,你也可以使用a、o、e、i、u 、v来表示,但这是国际通用的,不能随便改。
嗯,$(16)_{10} = (10)_{16}$ , $(11)_{16} = (17)_{10}$

IP地址的表示

我们知道IP地址是用点分十进制表示的,在教材中我们学到的是:IP地址用4组,每组8位的二进制数点分组成,但由于二进制数对人类不友好,所以用十进制表示。但其实我们可以换一个角度思考:它是256进制数,即使用256为底的256个字符来表示一个数,字符集 S = {1,2,3,…,255};在这个数字系统下,

$(192.168.0.1)_{256}$
$= (192\times(256)^{3}+168\times(256)^{2}+0\times(256)^1+1\times(256)^{0})_{10}$
$= 3232235521$

这数字是十亿级别的。

我们知道在将八进制转化为二进制时,每1位八进制数表示3位二进制数,因为 $2^{3} = 8$;将十六进制转化为二进制时,每1位十六进制表示4位二进制数,因为 $2^{4} = 16$;自然,将256进制数转化为二进制数时,每1位256进制数表示8位二进制数,因为 $2^{8}=256$。这样:

$(192.168.0.1)_{256}$
$= (01000000.00100000.00000000.00000001)_{2}$

显然使用256进制数表达十亿级别的数简洁些。

还有两个有趣的数字系统

玛雅数字系统

玛雅文明发明了一种二十进制的数字系统。他们使用贝壳、鹅卵石和木棍这三样东西来计数。看看下面的图片,贝壳代表”0”,鹅卵石代表”1”,而木棍代表”5”,通过鹅卵石和木棍组合出了其它的17个数。符合二十进制的定义:20为底的20个符号表示一个数。

这些字符确定后,所有的数都由它们的位置组合确定。
比如:$(233)_{10} = 11\times(20)^1+13\times(20)^0$
对应于玛雅数字系统中的:

巴比伦数字系统

巴比伦文明发明了一种六十进位的数字系统。他们使用两个碶形
符号:


)。
Y表示 “1”,而 < 表示 “10”。并由此组合出其它的57个符号。但是偏偏没有零。所以说他们的数字系统是不完善的,他们仅仅使用了59个符号,并通过空格和上下文来区别没有零可能造成的歧义。

在这个系统中 $(233)_{10} = 3\times(60)^1+53\times(60)^0$
用他们的符号表示是:

这真有趣( ̄▽ ̄)~*


本文标题: 从十进制数谈到巴比伦数字系统
文章作者: Lshare
许可协议: ©署名-非商用-相同方式共享 4.0