
1.3.3 常用数制及其转换
在计算机中数据是以二进制来表示的,但在现实生活中多以十进制数来进行计算,而在使用计算机程序设计语言对计算机进行操作时,还经常会用到八进制、十六进制。因此需要了解不同进制之间的关系。
1.数制
数制,也称计数制,是用一组固定数字和一些统一规则来表示数据的方法,一般可分为非进位计数制和进位计数制。
(1)非进位计数制
非进位计数制是指表示数值大小的数码与它在数中所处的位置无关。例如在罗马数字中,Ⅰ表示1,Ⅱ表示2,Ⅴ表示5,Ⅵ表示6。若按进位计数制的规则,Ⅱ应该表示11,Ⅵ应该表示51。
(2)进位计数制
进位计数制是指按指定进位方式计数的数制,即表示数值大小的数码与它在数中所处的位置有关。常见的有二进制、八进制、十进制和十六进制。
进位计数制包含三个要素。
•数码:一组用来表示某种数制的符号。例如,十进制的数码是0、1、2、3、4、5、6、7、8、9;二进制的数码是0、1。
•基数:某数制可以使用的数码个数。例如,十进制的基数是10;二进制的基数是2。
•位权:表示数码在不同位置代表的值的大小。例如,在十进制中个位的权值是1,十位的权值是10。
二进制的基数是2,使用两个数码:0、1,逢二进一。
八进制的基数是8,使用八个数码:0、1、2、3、4、5、6、7,逢八进一。
十进制的基数是10,使用十个数码:0、1、2、3、4、5、6、7、8、9,逢十进一。
十六进制的基数是16,使用十六个数码:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,逢十六进一。
为了区分不同进制的数,可以用数字下标标注,也可以加后缀表示,B表示二进制,O表示八进制,D表示十进制,H表示十六进制。例如:(1011)2、1011D分别表示二进制数和十进制数。
任何一种进位计数制的数都可以表示成按位权表示的多项式,例如:
(1011.11)2=1×23+0×22+1×21+1×20+1×2-1+1×2-2
(456.14)8=4×82+5×81+6×80+1×8-1+4×8-2
2.数制间的转换
(1)二进制转十进制
将二进制数按位权形式展开,然后按十进制的运算法则求和便可得到对应的十进制数。例如:
(1011.11)2=1×23+0×22+1×21+1×20+1×2-1+1×2-2=(11.75)10
(2)十进制转二进制
将十进制的整数部分和小数部分分别转换,然后将结果相加。
①整数部分的转换规则是“除二取余”。例如,将25D转换为二进制的过程如图1-5所示。将25除以2,记下余数,所得的商继续除以2,直到商为零为止。注意最先除得的余数是低位。将所得余数序列按由高位到低位的顺序排列便可得到对应的二进制数。

图1-5 十进制整数转二进制
即25D=11001B
②小数部分的转换规则是“乘二取整”。例如,将0.3125D转换为二进制的过程如图1-6所示。将0.3125乘以2,记下整数,余数部分继续乘以2,直到所要求的精度为止。将得到的整数序列由高位到低位排列便得到对应的小数部分。

图1-6 十进制小数转二进制
即0.3125D=0.0101B
(3)二进制数和八进制数之间的转换
三位二进制数对应一位八进制数。二进制数转八进制数时,将二进制数每三位分一组,整数部分从右向左分,最后一组不足三位时左边补零;小数部分从左向右分,最后一组不足三位时右边补零。将每组对应的八进制数写出来即可。例如:
10101110.0111→010.101.110.011.100→256.34
即(10101110.0111)2=(256.34)8
八进制数转二进制数时,将每位八进制数对应的三位二进制数写出来即可。例如:
125.1→001.010.101.001→1010101.001
即(125.1)8=(1010101.001)2
在八进制数转换为二进制数时注意一定要写够三位,比如上例中的2要转换为010而不是10,小数部分的1要转换为001而不是100。
(4)二进制数和十六进制数之间的转换
四位二进制数对应一位十六进制数。二进制数转十六进制数时,将二进制数每四位分一组,整数部分从右向左分,最后一组不足四位时左边补零;小数部分从左向右分,最后一组不足四位时右边补零。将每组对应的十六进制数写出来即可。例如:
10101110.0111→10101110.0111→AE.7
即(10101110.0111)2=(AE.7)16
十六进制数转二进制数时,将每位十六进制数对应的四位二进制数写出来即可。例如:
92F.C→1001.0010.1111.1100→100100101111.11
即(92F.C)16=(100100101111.11)2
常用的各进制数间的对照表如表1-1所示。
表1-1 常用进制数对照表

(5)其他进制之间的转换
十进制转八进制、十六进制可以用“除八取余”“除十六取余”的方法,也可以先转换为二进制,再转换为八进制、十六进制。其他进制转十进制可以用按权值展开的办法。
小游戏——猜姓
有五张写有姓氏的卡片如图1-7所示,你的姓在哪几张上有,我便知道你姓什么。

图1-7 姓氏卡片
下面我们看看其中有什么奥秘。首先把它抽象成数字,如图1-8所示,然后观察这些数字的排放有什么规律。

图1-8 数字卡片
实际上这些数字的安排是由对应的二进制数得到的。例如,1对应的二进制数为1,所以只有第1张上有;2对应的二进制数为10,所以只有第2张上有(低位对应左面的卡片,高位对应右面的卡片);3对应的二进制数为11,所以在第1张、第2张上有。又比如12对应的二进制数为1100,所以12只出现在第3张、第4张上;31对应的二进制数为11111,所以每张卡片上都有。
这是卡片的制作原理。在玩的过程中就不必做进制转换了,只要记住每张卡片左上角的数字即可。比如对方说第1、3、5张上有,你便快速地将第1、3、5张左上角的1、4、16三个数相加,告诉对方所猜的数是21。如果熟练了,闭上眼睛都能说出来。若要猜姓氏,需要更多的练习。