你在这里

2、二进制,十进制,及其互换

主标签

  • 2 二进制,十进制,及其互换

自从我觉得(内心暗自思忖)自己不擅长解数学难题以来,总是为我自己的才华不济而感到暗自惊讶.诚然,许多挚友都给我作了解释,说在我的内心深处有一种巧妙隐藏着的笨脾气,但这种说法我却从未接受过.

不幸的是,舍此而外我又提不出其他的解释.

你一定想象得出,当我偶然解开一道自己能找到答案的难题时,我有多么开心.在我还很年轻的时候,曾凑巧有这么一件事,一直使我终生难忘,现让我较为详细地说给你听,因为这件事能把我带到我要说的问题上去.

问题的内容是这样的:随便给你一些单位砝码,如一克,二克,三克,四克等等.你可以在这些单位砝码之外选择一个足够大的数字,用适当的方法把砝码相加起来,就可以得到从一克到一千克的任何整克数的重量.但是,用什么办法来选择单位砝码,能以个数最少的砝码来做到这一点呢?

我就这样来推理:我必须从一克重的砝码开始,因为只有用它才能称起一克的重量.现在,如果再取另一个一克重的砝码,我就可以用这两个一克重的砝码称起二克的重量,然而,我可以取一个
二克重的砝码来代替两个一克重的砝码,这样可以更省事些,因为这时我不仅可以用它来称起一克的重量,而且可以使用这个二克重的砝码加上一个一克重的砝码来称起三克的重量.

接着怎么办呢?也许取一个三克重的砝码吧?那是多余的,因为三克的重量已经可以用二克加一克来称出.因此我就可以跳过一步而选取一个四克重的砝码,这就不仅能使我称起四克的,也可以称起五克(四克加一克),六克(四克加二克)和七克(四克加二克加一克)的重量.

际此,我就看到了一个规律,如果我所能达到的最大重量是七克,则下一步我就可以取一个八克重的砝码,这就使我能称出十五克(八克加四克加二克加一克)以下的任何整克数,再下一步将是取一个十六克重的砝码,很清楚,为了称出任何克数,必须取一系列的砝码(从一克开始),每取一个砝码都是小于它的那个砝码的双倍数.

这就是说,我可以用十个而且只需十个砝码就称出一克到一千克的任何整克数,它们是:1克,2克,4克,8克,16克,32克,64克,128克,256克,512克.实际上,这些砝码可以一直称到1023克的的重量.

现在,我们可以把砝码丢开,只用数字来计算.用1,2,4,8,16,32,64,128,256,512这些数字,而且只用这些数字,你可以用把它们中的两个或两个以上相加起来的办法表达出直到1,023并包括1,023本身的任何整数.比如,100这个数就可以表达为64加32加4.729这个数可以表达为512加128加64加16加8加1,当然,1,023可以表达成所有这十个数字之和.

如果在这个数字系列中再加入1,024这个数,你就可以继续构成直至2,047以下的数字,如果你接着再加上2,048,那么你就可以继续构成至4,095以下的数字.如果下一步……这样,如果从1开始,然后无限地倍增下去,你就可以得到一个数列,把这些数通过适当的方法相加起来,就可以用来表示任何有限的数字.

到此为止,情况很不错,但我们有趣的数列——1,2,4,8,16,32,64……似乎显得有点凌乱,肯定存在一种更简洁的表达方法,下面就来谈这个问题.

让我们暂且把1扔开,先对2作一番研究.如果我们这样做的话,可以从这样一个重要的声明开始,那就是2就是2(有任何异议吗?),然后挨到下一个数,我们说4是2乘2,8是2乘2乘2,16是2乘2乘2乘2,32是……这样,你就可以得出一个概念了.

因而,我们可以这样来建立数列(仍然不去理会l):2,2乘2,2乘2乘2,2乘2乘2乘2,等等.这样就显出了一种和谐的一致性和规律性,但所有那些2乘2乘2都会在眼前引起厌恶.因此,使用指数方法,就可以不写出所有的2而方便地看出有几个2的相乘.

这样,如果4等于2乘2,我们可以把它叫作22.(2的二次幂,或者说2的平方).进而如果8是2乘2乘2,我们可以把8写成23(2的三次幂,或2的立方)来记写三个2的相乘,按照这条路线继续下去,必定可以得到16是24(2的四次幂),32是25(2的五次幂)等等.至于2本身,只包含一个2,我们可以把它叫21(2的一次幂). 

还有一件事,我们可以令2(2的零次幂)等于1(事实上,令任何数的零次幂等于1都是可以的;即3等于1,17和1,965,211也都如此,但目前我们只对2感兴趣,故令它等于1).

这样,我们就可以用2,21,22,23,24,25,26……来取代数列1,2,4,8,16,32,64……就各项的数值来看,它是同样的一个数列;不过用第二种方法来写,多少显得好看一些,而且,正如我们即将看到的,要更有用一些.

我们可以用这些2的幂来表示任何数.上面已说过,100可以表达为64加32加4,就是说,它可以表达为26加2522.用这样的方法,如果729等于512加128加64加16加8加1,则它也可表达为29加27加26加24加23加2.当然,1,023等于29加28加27加26加25加24加23加22加21加2

接着我们把这个方法系统化.我们用十个2的不同的幂来表示任何小于1,024的数,我们理所当然地要提到所有这些数.在表达某一个特定数字所作的加法中,如果不想使用某一个幂,那只需把它乘以零;如果需要用它,那就乘以1,或是使用某个幂,或是不用它;或是将它乘以1,或是乘以零,那就是我们唯一的选择.

如果用一个点来表示乘法,我们就可以说1,023是:1·29加1·28加1·27加1·26加1·25加1·24加1·23加1·22加1·21加1·2,所有的幂都用上了.表示729,可以写成:1·290·28加1·27加1·26加0·25加1·24加1·23加0·22加0·21加1·2;再者,表示100,可以写成0·29加0·28加0·27加1·26加1·25加0·24加0·23加1·22加0·21加0·2

你也许要问,为什么要把这些用不到的幂也包括进去,既把它们写了进去,而又通过乘以零把它们抹去,这不是自找麻烦吗?然而问题在于,如果把它们毫无例外地一律写出来,就可以把它们的存在视为当然,然后把它们全部抹去,只保留1和0.

这样,我们可以把1,023写成111111111,而把729写成1011011001,把100写成0001100100.

事实上,我们可以把它加以系统化,记住幂的次序,就可以把1到l,023的所有整数用2的十个幂来表达如下:

0000000001等于1 
0000000010等于2 
0000000011等于3 
0000000100等于4 
0000000101等于5 
0000000110等于6 
0000000111等于7 
依次类推,直到
…  …  …  …  …
1111111111等于1,023

当然,我们不必把自己局限在2的10次幂以下,可以有11次幂,14次幂,53次幂,或无限大的一个数次幂,然而,写出无数个1和0,仅仅为了表示这无数个2的幂中哪一个要用,哪一个不用,确是件很繁琐的事.因此,约定对某特定数字,把所有不用的2的高次幂略去不写,仅仅从所用的最高次幂开始写,并从它开始继续写下去.换句话说,把所有左边无间断的一连串零都略去不写,这样,这些数就可以表示成:

1等于1 
10等于2 
11等于3 
100等于4 
101等于5 
110等于6 
111等于7等等

用这样的方式,所有数字都可以用1或0的某种组合来表示.事实上,也有一些原始的部落曾经使用过这样的一种记数方法.然而,文明世界最早系统地发现这一点的数学家是大约三个世纪前的莱布尼兹(Gottfried Wilhelm Leibniz).他曾为此而大觉惊异,但又觉得心满意足,因为他推断说,1表示统一,很明显是上帝的标记,而0表示无,在上帝的身边,处于万物的开端.因此,如果只用1和0就可以把所有的数字都表示出来的话,那无疑是说,上帝从虚无中创造了宇宙.

尽管这种象征叫人敬畏,但1和0的这种玩意儿对无论哪一位实际办事的人都未曾留下什么印象.这也许是一个叫人留恋的数学奇观:但没有哪一个会计人员会愿意用1011011001来代替729.

但以后突然地发现这种二进数制(也称为“二元数系”,来自拉丁文binarius,意即“每次二个”)对电子计算机来说却是很理想的.

总之,两个不同的数字1和0在计算机上可以通过一个特别按钮的两种不同位置“开”和“关”来进行搭配.令“开”表示1,“关”表示0.那末,如果机器有十个按钮,数字1,023
就可以表示为开开开开开开开开开开,而729则可表示为开关开开关开开关关开,100可表示为关关关开开关关开关关.

通过增加按钮,就可用这种开关的组合来表示我们要表示的任何数字.它也许对我们显得相当繁琐,但对计算机来说却是十分简单.说实在的,用于计算机再也想不出比它更简单的其他数制了.

莱布尼兹

莱布利兹 成长吧啊

哥特弗里德·威尔赫姆·莱布尼兹于1646年7月1日出生于萨松尼的莱比锡,是位罕见的神童.他八岁自学拉丁文,十四岁自学希腊文,1665 年获得法学学位,同时又是外交官、哲学
家、政论作家并试图作为天主教徒和新教徒之间的一名调停者,间或还做过俄国彼得大帝的顾问.1671年他第一个发明了一台能进行加、减、乘、除运算的机械.

 

莱布尼兹曾于1673年访问伦敦,此后开始从事称之为微积分的数学分支的研究,1684年发表著作,差不多同时,伊萨克·牛顿(Isaac Newton)也独立完成了微积分的研究,但牛顿凡事总有点儿小心眼,致使他的天才不能尽情发挥.他责备莱布尼兹是剽窃者,在这两个人的辩护者之间展开了长期的论战.但实际上,莱布尼兹的发展是十分出色的,在英国,由于坚持追随牛顿,以致在数学方面落后了一个半世纪.

1700年,莱布尼兹劝说普鲁士国王弗莱德里克(Frederick)一世建立了柏林科学院,并出任第一任院长.然而,整个壮年时代他差不多都在汉诺威选帝侯手下工作,1714年,当时的选帝侯登上大不列颠王位成为乔治(George)一世时,莱布尼兹曾热望随他一起赴伦敦.可是,做国王的并不是事事信赖别人,却总是唯我独尊,乔治一世已不再需要莱布尼兹,莱布尼兹晚年已被人遗忘.于1716年十一月十四日死在汉诺威,送葬者只有他的秘书一人.

然而,由于我们是人而非机器,问题就来了,我们能不能掌握二进制?比如,我们能否在二进数和普通数字之间进行相互换算?如果给你一个二进数110001,它表示哪一个普通数字呢?

其实这并不难.二进制使用2的幂,从其右端以2开始,每向左移动一位,幂指数即增加1.因此我们可以在数字110001的下方以小一号字体的数字来表示指数,比如
110001
543210

只有1下方的指数是有用的,因此110001就表示成25加24加2或32加16加1,换句话说,二进制中的110001在普通数制中表示49.

用另一种方法还要更省事些.如果愿意的话,可以不管好歹地设法把2的幂与普通数字配对,但并不是非此不可.这儿有一个常规的方法可供使用,它总是灵验的.下面让我慢
说来.(请原谅!这个方法为什么灵验恕我不作解释了).

假定要把一个普通数字换算成二进数,你可以把它除以2,把余数写在一边(如果该数为偶数,则余数为零,如果为奇数,则余数为1).再把商的整数部分除以2,再次把余数放
在一边,再把新的商的整数部分除以2,这样重复除下去,直到商的整数部分减为零为止.把余数从末尾往回读,就得出二进制中原来的数.

如果这听起来好象很复杂的话,可以举一例子来说明,就会简单明了,试以131为例:

131除以2商为65 余1 
65除以2商为32 余1 
32除以2商为16 余0 
16除以2商为8 余0 
8除以2商为4 余0 
4除以2商为2 余0 
2除以2商为1 余0 
1除以2商为0 余1 

这样,在二进制中,131就可写成1000011.

只需稍作练习,每个具有四年级算术知识的人都可以学会普通数和二进数之间的相互换算.

二进制还有一个好处.就是它使普通数字的算术运算变得特别简单.使用普通数字,我们在低年级时要花数年来记住9加5等于14,8乘3等于24等等,但是在二进制中,总
共只有两个数字:1和0.因而,一次取两个数字做加法时,它们的和只有四种可能性:0加0,1加0,0加1,1加1.前三个和正巧与普通数字的算术运算中完全相同,即:

0加0等于0 
1加0等于1 
0加1等于1 

第四个和稍有不同:在普通数字的算术中,1加1等于2,但在二进制中没有2这一个数字,2在二进制中被表示成10,因此, 

1加1等于10(记下0进1)

可以想象,在二进制中加法将变得如何简单,如果想把1001101和11001相加,则它们的和将为:

二进制 成长吧啊

你可以轻而易举地根据我刚才给你的加法表把它们换算成普通数字(假定你已学会),你就可以看出,上述加法相当于77加25等于102.

在你看来,要习惯于1和0实在是很困难的,记忆加法规则简便多了,但这抵不上失去对整个事物的联系的不便.对人来说,这也许是事实.但在计算机中,开关按钮很容易设计
成这样的组合,使开和关能服从二进制中的加法规则.计算机不会将大量的电子振动脉冲弄乱,并且可以通过二进制加法在几微秒内将数字相加起来.

当然(再回到人上来),如果想把两个以上的数字相加起来,最糟糕的是总得把这些数两两分组.如果把110,101,100和111相加,可以先把110和101相加,得到1011,然后把
100和111相加,得到1011,最后把1011加上1011得到10110(最后一个加法涉及到把l加1加1,当作把1加入已经是1加1的竖列中去的结果;但1加1是10,而10加1是11,故1加1加1是11,记1进l).

在二进制中的乘法甚至更为简单.同样,也只有四种可能的组合:0乘0,0乘1,1乘0,1乘1.这里,二进制中的每一个乘法完全与在普通数字中的一样,即:

0乘0等于0 
0乘1等于0 
1乘0等于0 
1乘1等于1 

把101与1101相乘,可以得到

二进制数相乘 成长吧啊

这相当于在普通数字中5乘13等于65.同样,计算机可设计成通过操作按钮的开和关以配合二进制乘法表的要求,并以令人眼花缭乱的速度进行.

也可能建立一个以3的幂为基数的数制(三进制,或“三元”数系).其数列为3,31,32,33,34等等(即1,3,9,27,81等等),它们亦可用来表示任何指定的数字,如果允许将该数列中每项最多使用两次的话.

这样,17是9加3加3加1加1;72是27加27加9加9.

如果想根据三进制来写出整数的数列,它们将是1,2,10,11,12,20,21,22,100,101,102,110,111,112,120,121,122,200等等.

也可以建立一个四进制的数制,它以4的幂为基数,每个幂最多可用三次;一个五进制的数制,以5的幂为基数,每个幂最多可用四次,等等.

将普通数字换算成其他一种数制,只需用类似于我已在二进制中演示过的那种方法,以三进制来说,可重复地除以3;以四进制来说,可重复地除以4,等等.

这样,我刚才已将普通数字131通过重复除以2并使用余数来换算成二进制数11000001,现在如果我们以3 来除131,并使用余数:

131除以3商为43余2 
43除以3商为14余1 
14除以3商为  4余2 
4除以3商为  1余1 
l除以3商为 0余1 

将余数自下而上地写出,则131在三进制中就可表达为11212.

用同样的方法,可以分别得出131在四进制中,五进制中等等是怎么样的数字.这儿列出一张简明表,表中给出了131一直到九进制中的数值:

在二进制中11000001 
在三进制中11212 
在四进制中2003 
在五进制中1011 
在六进制中335 
在七进制中245 
在八进制中203 
在九进制中155 

可以通过幂来检验这些数字.比如,在九进制中,155是1·92加5·91加5·9.由于92为81,91为9,9为1,所以81加45加5,即131.在六进制中,335为3·62加3·61加5·6
,由于62为36,61为6,6为1,所以108加18加5,即131.在四进制中,2003是2·43加0·42加0·41加3·4,由于43为64,42为16,41为4,4为1,所以128加0加0加3,即
131.

你可任选其余各数,自作一番验算.

计算机

计算机在当今受到舆论的非议,认为它们一无灵感二无人性.但人们盼望的是什么呢?他们成十亿地生活在地球上,他们坚决支持着成千亿地化钱的政府(他们确实是这样做的.每个美国人都赞成削减政府的开支,除非这样做会危及他们的生活方式;由于每项削减都会损害成百万人的生计,因此就无法作出什么削减),他们坚决主张庞大的企业、庞大的科学事业、庞大的武装部队以及庞大的一切.这就使事情变得如此复杂,要是少了计算机,简直是寸步难行.

当然,计算机也会犯可笑的错误,但问题根子不在计算机上,而在为计算机编写程序或操作者身上.如果轧不平你的支票存根,你到底责怪数制呢还是责怪你的加法技巧蹩脚?(责怪数制吗?那我猜想你也会责怪计算机的.)

计算机 成长吧啊

图4 电子计算机(从这图可以看出,这书有点历史了,不过不能掩盖它是一本好书)

缺之人性吗?我猜想,原始的苏美尔人建筑师也曾有过这样的埋怨.在测量所建筑的庙宇距离时,也会因他的年轻学徒所带的打结头的绳子感到生气和讨厌,他会说,建筑师应当使用他的头脑和眼睛,不应当依赖全无灵性的机械工具.

的确,人们对计算机所说的坏话仅仅是想当然的貌似聪明的低劣攻击,已经无法把计算机从社会生活中分离出去,除非是引起灾难.要是所有的计算机罢工二十四小时,你就会体会到什么是一个完全闭塞的国家的含义.

在充分利用了我们现代技术益处的同时又对之加以指责真是件十拿九稳的事,不必付出任何代价.

但事情是不是到九进制为止了呢?是否还有十进制?好吧,假定我们在十进制中写下131,用10来把它除一下:

131除以10商为13余1 
13除以10商为   1余3 
1除以10商为   0余1 

可见131在十进制中为131.

换句话说,我们的普通数制就是十进制,用10的一系列幂来写:10,101,102,103等等.数字131等于1·102加3·101加1·100.由于102为100,101为10,100为1,这就意
味着,100加30加1,即131.

由此可见,普通的数制完全不是基本的或者基础的记数制.它们是建立在10的幂的基础上,因为我们有十个手指,我们是以手指开始计数的,但任何其他数字的幂同样也能满足数学上的所有要求.

这样,我们可以继续下去,得到十一进制和十二进制.但在这里产生了一个困难,任何数制中的数字符号的个数(把零算在内)都相当于用作基数的数字.

在二进制中,需要两个不同的数字符号:0和1,在三进制中,需要三个不同的数字符号:0、1和2.当然,在我们熟悉的十进制中,需要十个不同的数字符号:0,1,2,3,4,5,6,7,8和9.

那末接下来,在十一进制中,就需要十一个不同的数字符号,在十二进制中,则需要十二个不同的数字符号.可把第十一个数字符号记作@,把第十二个数字符号记作#.在普通
的十进制中,@表示10,而#为11.

这样,在十一进制中,131为:
131除以11商为11余10(@)
11除以11商为   1余0 
1除以11商为   0余1 
因此,131在十一进制中为10@.

在十二进制中,
131除以12商为10余11(#)
10除以12商为   0余10(@)
故在十二进制中,131为@#.

如果需要的话,我们还可以再一步一步地上溯,得到4,583进制(把零算在内,需要4,583个不同的数字符号).

现在看来,使用哪一种数制都是合理的,问题在于使用哪一种数制最为方便.随着基数的逐步增加,数字似乎变得越来越短.虽然131在二进制中是11000001,在十进制中是131,
在十二进制中只是@#,从八位数缩短成二位数.事实上,在l31(或更高的)进制中,它会变成只有一位数.从这方面来看,说明方便性增加了.谁会需要长长的数字呢?

然而,随着基数的增加,用于构成数字的不同数字符号也增加,这就增加了不方便.应当找到一种折衷的数制,在这种数制中,所用不同的数字符号并不太多,而我们常用数字的数位又不太长.

很自然地,对我们来说,似乎是十进制最恰当.记住十个不同的数字符号,似乎不必付出太高的代价,而构成一万以下的任何一个数字时,最多只需使用四个数字符号就可组合了.

当然,十二进制也常常被提出来.在十二进制中,四个数字符号的组合可以表达二万多一些的数目,但这个好处看来还抵不上学习掌握二个额外的数字符号所增加的困准(小学生将不得不记住诸如@加5等于13,#乘4等于38等等的运算).

这里,还出现了另一种说法.在谈及任何一种数制时,往往趋向于谈论如10,100,1000之类的整数.在十进制中,10只能被2和5整除.而在十二进制中,10(相当于十进制中的12)可以被2,3,4,6整除,这意味着十二进制更适用于商业往来.其实,十二进制在以打(十二个)、箩(一百四十四个)出售商品时就被应用了.因此,在十二进制中,12即为10,
144即为100.

然而,在当前计算机的时代里,二进制显得更有吸引力.但二进制是一种由1和0组成的既不协调又不美观的混合体,因而有一种可能的折衷.

二进制和八进制有着密切的联系,因为在二进制中的1000等于八进制中的10,或者你愿意的话可写成23等于81,因此,可以建立下列对应关系:

二进制    八进制
0 0 0      0 
0 0 1      1 
0 1 0      2 
0 1 1      3 
1 0 0      4 
1 0 1      5 
1 1 0      6 
1 1 1      7 

这个表格可以把八进制中的所有个位数(包括0)同二进制的所有三位数(包括000)联系起来.

因此,任何一个二进制数字都可分拆成三个数字为一组(需要时在左端加0)并使用上表换算成八进制数字.这样,二进数111001000010100110就能分拆成111,001,000,010,
100,110,即可写成八进数710246,八进制数字33574可以写成二进制数字011011101111100.一旦记住了上表,换算速度就几乎同书写速度一样快.

换句话说,如果我们从十进制改变为八进制,则我们同机器之间能有更多的相互理解,谁知道科学又会进步得多快呢.

当然,这样的改变是不切实际的.但只要想一想,假定起初原始人学会只用他的八个手指来计数,把这两个笨拙又讨厌的拇指丢开的话,那该有多好啊!