0.1 数的进制
十进制是我们熟悉的计数系统,它用十个符号0,1,2,3,4,5,6,7,8,9来表示整数。在表示一个整数时,符号的位置(也就是我们过去常说的位置值原则)是重要的:从右边开始,第一个符号表示1(1=100)的个数,第二个符号表示10(10=101)的个数,第三个符号是100(100=102)的个数,…,第n个符号代表10n-1的个数,等等。例如,73854=7× 104+3×103+8×102+5×101+4×100。我们把系统所基于的那个数(十进制系统就是10)称为基数。
计算机科学要用到10以外的基数。比如,二进制就是以2为基数的计数系统。下面我们讨论二进制系统。
在二进制数字系统(基数为2)中,只用两个符号0和1来表示一个整数。从右边开始,第一个符号表示1(1=20)的个数,第二个符号表示2(2=21)的个数,第三个符号是4(4=22)的个数,第四个表示8(8=23)的个数,…,第n个位置的符号表示2n-1的个数。比如,二进制数1010111112可以化为十进制数
1·28+0·27+1·26+0·25+1·24+1·23+1·22+1·21+1·20=351
如果不知道使用的是什么数制系统,一个数字所表示的意义将是含混的。比如,101101在十进制中表示某个数,在二进制中则表示完全不同的另一个数。通常情况下,读者能从上下文知道所用的是什么数制。但是,如果我们要完全地明确表示一个数,就把基数作为下标来标记所用的数制系统——十进制用下标10,二进制用下标2,等等。例如,二进制的101101用1011012来表示,十进制的101101用10110110来表示。
例0.1.1
二进制数1011012表示此数由一个1、没有2、一个4、一个8、没有16、一个32等组成。它可以表示为
1011012=1·25+0·24+1·23+1·22+0·21+1·20
用十进制计算上面式子的右边,得出
此例告诉我们,如何把一个二进制数转换为一个十进制数。
下面考虑相反的问题——把一个十进制数转换为一个二进制数,例如,要把十进制数91转换为二进制数。首先我们用91除以2,得到
再把45除以2,得
把上式的45代入式(0.1.1),得
再把22除以2,得
22=2·11
将它代入式(0.1.3),得
再把11除以2,得
11=2·5+1
将它代入式(0.1.4),得
再把5除以2,得
5=2·2+1
将它代入式(0.1.5),得
上面的计算表明,当N(或商)逐次被2除时所得的余数,就给出了N的二进制表示的各个位置上的数。在(0.1.1)式中,第一次被2除的余数就是最低位(1的个数),在(0.1.2)式中,第二次被2除的余数就是代表2的个数的位,等等。
例0.1.2
把十进制131写为二进制。
下面的计算表明,逐次被2除,余数就是从右边开始的各个二进制位。
直到所除得的商数为0时,停止计算。第一次被2除的余数就是最低位(1的个数),第二次被2除的余数就是表示2的个数的位,等等。也就是说,将所得余数从下往上排列为从左向右的形式,我们就得出:
13110=100000112
十进制数相加的方法也可以用于二进制数相加,但是,我们要把十进制加法表用二进制加法表代替,见表0.1.1。
表0.1.1
在十进制中,1+1=2,且210=102。所以,在二进制中,1+1=10。
例0.1.3
把二进制数10011011和1001011相加。
我们把问题写为
与十进制加法一样,我们从右边开始,把1和1相加,其和为102,于是我们写出0并有进位1。此时计算成为
下面,把三个1相加,得112写出1,还有进位1。此时,计算成为
继续此法,我们得出
在计算机系统中,重要的数制还有八进制和十六进制的系统。下面我们讨论十六进制系统,而把八进制系统作为练习题。
在十六进制系统中,表示整数的符号是:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E和F共16个字符,其中的符号A~F代表十进制数的10~15(一般来说,N进制的系统,需要N个不同的符号来表示0,1,2,…,N-1)。在表示一个整数时,从右边开始,第一个符号表示1的个数,第二个符号表示16的个数,第三个符号表示162的个数,…,第n个位置的符号表示16n-1的个数,等等。
例0.1.4
把十六进制数B4E转换为十进制数。
我们有
类似于二进制的讨论,要把一个十进制数转换为十六进制数,我们逐次把它(或者商)除以16,所得的余数就给出了十六进制的各个数位上的符号。
例0.1.5
把十进制数20385转换为十六进制数。
用20385(或商)依次除以16,余数就是从右边开始的各个十六进制位上的符号。
一直到商数为0时,停止计算。第一次被16除的余数就是最低位(1的个数),第二次被16除的余数就是16的位置上的数,如此等等,我们得出:
2038510=4FA116
下面的例子表明,我们可以用十进制数相加的方法来进行十六进制数的相加。
例0.1.6
把十六进制数84A和42EF相加。
问题可以写为
我们从最右边开始,把F和A相加。由于F是1510,A是1010,所以
下面我们把1,4和E相加,满16进1,写出余下的3,得1316。
继续照此进行,得到
例0.1.7
将二进制数转换成八进制数或十六进制数的方法是:从最低位开始向左边按每3位(转换成八进制数)或每4位(转换成十六进制数)分组,最后不满3位或4位的,则填0补充,再将每组用对应的八进制数或十六进制数代替,即可得相应的八进制数或十六进制数。
把二进制1110110100转换成八进制。
二进制1,110,110,100 每3位一组
001,110,110,100最高位补0
八进制1 6 6 4 结果
于是,11101101002=16648
把二进制1110110100转换成十六进制。
二进制11,1011,0100 每4位一组
0011,1011,0100最高位补0
16进制3 B 4 结果
于是,11101101002=3B416
例0.1.8
将八进制数或十六进制数转换成二进制数的方法是:将八进制数和十六进制数的每一位用对应的3位或4位二进制数来表示即可(参见表0.1.2)。
把八进制327转换成二进制。
八进制3 2 7
二进制011010 111
于是,3278=0110101112
把十六进制7A转换成二进制。
十六进制7 A
二进制01111010
于是,7A16=11110102
表0.1.2
习题0.1
1.把下列各二进制数改写为十进制数和十六进制数。
(1)100101
(2)101011
(3)10011011
(4)1100000
2.把各十进制数表示为二进制数和十六进制数。
(1)34
(2)61
(3)403
(4)1024
3.把下列二进制数相加。
(1)1011+1110
(2)101011+1101
(3)110110+101101
(4)101101+110101
4.把十六进制数表示为十进制数和二进制数。
(1)3A
(2)1E9
(3)3F7C
(4)A03
5.把下列各十六进制数相加。
(1)4A+B4
(2)49F7+C6E
(3)3B9C+9E2D
6.2010是一个二进制数吗?是一个十进制数吗?是一个十六进制数吗?
7.1001010是一个二进制数吗?是一个十进制数吗?是一个十六进制数吗?
8.完成表0.1.3所列的八进制加法表。
表0.1.3
9.把下列八进制数转化为十进制数、二进制数、十六进制数。
(1)73
(2)7654
(3)632
(4)207