按进位的方法进行计数,称为进位计数制。为了电路设计的方便,计算机内部使用的是二进制计数制,即“逢二进一”的计数制,简称二进制(Binary)。但人们最熟悉的是十进制,所以计算机的输入/输出也要使用十进制数据。此外,为了编制程序的方便,还常常使用到八进制和十六进制。下面介绍这几种进位计数制和它们相互之间的转换。
十进制(Decimal)有两个特点:其一是采用 0~9共10个阿拉伯数字符号;其二是相邻两位之间为“逢十进一”或“借一当十”的关系,即同一数码在不同的数位上代表不同的数值。我们把某种进位计数制所使用数码的个数称为该进位计数制的“基数”,把计算每个“数码”在所在位上代表的数值时所乘的常数称为“位权”。位权是一个指数,以“基数”为“底”,其幂是数位的“序号”。数位的序号以小数点为界,其左边的数位序号为0,向左每移一位序号加一,向右每移一位序号减一。由此任一个十进制数都可以表示为一个按位权展开的多项式之和,如十进制数5678.4可表示为:
5678.4=5×10 3 +6×10 2 +7×10 1 +8×10 0 +4×10 -1
其中,10 3 、10 2 、10 1 、10 0 、10 -1 分别是千位、百位、十位、个位和十分位的位权。
二进制(Binary)也有两个特点:数码仅采用“0”和“1”,所以基数是2;相邻两位之间为“逢二进一”或“借一当二”的关系。它的“位权”可表示成“2 i ”,2为其基数, i 为数位序号。所以任何一个二进制数都可以表示为按位权展开的多项式之和,如二进制数1100.1可表示为:
1100.1=1×2 3 +1×2 2 +0×2 1 +0×2 0 +1×2 -1
八进制(Octal)用的数码共有8个,0~7,基数是8;相邻两位之间为“逢八进一”和“借一当八”的关系,它的“位权”可表示成“8 i ”。任何一个八进制数都可以表示为按位权展开的多项式之和,如八进制数1537.6可表示为:
1537.6=1×8 3 +5×8 2 +3×8 1 +7×8 0 +6×8 -1
十六进制(Hexadecimal)用的数码共有16个,除了0~9外又增加了6个字母符号A、B、C、D、E、F,分别对应了十进制数10、11、12、13、14、15;其基数是16,相邻两位之间为“逢十六进一”和“借一当十六”的关系,它的“位权”可表示成“16 i ”。任何一个十六进制数都可以表示为按位权展开的多项式之和,如十六进制数3AC7.D可表示为:
3AC7.D=3×16 3 +10×16 2 +12×16 1 +7×16 0 +13×16 -1
K 进制用的数码共有 K 个,其基数是 K ,相邻两位之间为“逢 K 进一”和“借一当 K ”的关系,它的“位权”可表示成“ K i ”, i 为数位序号。任何一个 K 进制数都可以表示为按位权展开的多项式之和,该表达式就是数的一般展开表达式:
其中, K 为基数, A i 为第 i 位上的数码, K i 为第 i 位上的位权。
二进制数、八进制数、十六进制数转换成十进制数
转换的方法就是按照位权展开表达式,例如:
①(111.101) 2 =1×2 2 +1×2 1 +1×2 0 +1×2 -1 +1×2 -3 =4+2+1+0.5+0+0.125=(7.625) 10
其中利用括号加脚码来表示转换前后的不同进制,以下例中不再加以说明。
②(774) 8 =7×8 2 +7×8 1 +4×8 0 =(508) 10
③(AF2.8C) 16 =10×16 2 +15×16 1 ×2×16 0 +8×16 -1 +12×16 -2 =2560+240+2+0.5+0.046875=(2802.546875) 10
将十进制数转换成等值的二进制数,需要对整数和小数部分分别进行转换。整数部分转换法是连续除2,直到商数为零,然后逆向取各个余数得到一串数位即为转换结果,如:
11÷2=5----------余数 1
5÷2=2----------余数 1
2÷2=1----------余数 0
1÷2=0----------余数 1
逆向取余数(后得的余数为结果的高位)得:(11) 10 =(1011) 2
十进制数转换成二进制数、八进制数、十六进制数
小数部分转换法是连续乘2,直到小数部分为零或已得到足够多个数位,正向取积的整数位(后得的整数位为结果的低位)组成一串数位即为转换结果,如:
0.7×2=1.4------------整数部分为 1
0.4×2=0.8------------整数部分为 0
0.8×2=1.6------------整数部分为 1
0.6×2=1.2------------整数部分为 1
0.2×2=0.4------------整数部分为 0(进入循环过程)
若要求4 位小数,则算到第5位,以便舍入。结果得:(0.7) 10 =(0.1011) 2
可见有限位的十进制小数所对应的二进制小数可能是无限位的循环或不循环小数,这就必然导致转换误差。仅将上述转换方法简单证明如下。
若有一个十进制整数A,必然对应有一个 n 位的二进制整数 B ,将 B 展开表示就得下式:
(A) 10 = b n -1 ×2 n -1 + b n -2 ×2 n -2 +…+ b 2 ×2 2 + b 1 ×2 1 + b 0 ×2 0
当式子两端同除以2,则两端的结果和余数都应当相等,分析式子右端,除了最末项外各项都含有因子2,所以其余数就是 b 0 。同时 b 1 项的因子2没有了。当再次除以2, b 1 就是余数。依此类推,就逐次得到了 b 2 、 b 3 、 b 4 …直到式子左端的商为0。
小数部分转换方法的证明同样是利用转换结果的展开表达式,写出下式:
( A ) 10 = b -1 ×2 -1 + b -2 ×2 -2 +…+ b -( m-1) ×2 -m + 1 + b -m ×2 -m
显然当式子两端乘以2,其右端的整数位就等于 b -1。当式子两端再次乘以2,其右端的整数位就等于 b -2。依此类推,直到右端的小数部分为0,或得到了满足要求的二进制小数位数。最后将小数部分和整数部分的转换结果合并,并用小数点隔开就得到最终转换结果。
对整数部分“连除基数取余”,对小数部分“连乘基数取整”的转换方法可以推广到十进制数到任意进制数的转换,这时的基数要用十进制数表示。例如,用“除8逆向取余”和“乘8正向取整”的方法可以实现由十进制数向八进制数的转换;用“除16逆向取余”和“乘16正向取整”可实现由十进制数向十六进制数的转换。将十进制数269转换为八进制数和十六进制数的计算如下:
269÷8=33 ---余数 5 269÷16=16 ---余数13
33÷8=4 ----余数 1 16÷16=1 ----余数 0
4÷8=0 ----余数 4 1÷16=0 ----余数 1
得:(269) 10 =(415) 8 得:(269) 10 =(10D) 16
由于3位二进制数所能表示的也是8个状态,因此一位八进制数与3位二进制数之间就有着一一对应的关系,转换就十分简单,即将八进制数转换成二进制数时,只需要将每一位八进制数码用3位二进制数码代替即可,例如:
(367.12) 8 =(011 110 111.001 010) 2
为了便于阅读,这里在数字之间特意添加了空格。若要将二进制数转换成八进制数,只需从小数点开始,分别向左和向右每3位分成一组,用一位八进制数码代替即可,例如:
(10100101.00111101) 2 =(10 100 101.001 111 010) 2 =(245.172) 8
这里要注意的是:小数部分最后一组如果不够3位,应在尾部用零补足3位再进行转换。
与八进制数类似,一位十六进制数与4位二进制数之间也有着一一对应的关系。将十六进制数转换成二进制数时,只需将每一位十六进制数码用4位二进制数码代替即可,例如:
(CF.5) 16 =(1100 1111.0101) 2
将二进制数转换成十六进制数时,只需从小数点开始,分别向左和向右每4位一组用一位十六进制数码代替即可。小数部分的最后一组不足4位时要在尾部用0补足4位,例如:
(10110111.10011) 2 =(1011 0111.1001 1000) 2 =(B7.98) 16
二进制数只有0和1两个数码,它的算术运算规则比十进制数的运算规则简单得多。
二进制加法规则共4条:0+0=0;0+1=1;1+0=1;1+1=0(向高位进位1)。
如将两个二进制数1001与1011相加,加法过程的竖式表示如下:
二进制减法规则也是4条:0-0=0;1-0=1;1-1=0;0-1=1(向相邻的高位借1当2)。
如:1010 – 0111=0011。
二进制乘法规则也是4条:0×0=0;0×1=0;1×0=0;1×1=1。
如求二进制数1101和1010相乘的乘积,竖式计算如下:
从该例可知其乘法运算过程和十进制的乘法运算过程非常一致,仅仅是换用了二进制的加法和乘法规则,计算更为简洁。
二进制的除法同样是乘法的逆运算,也与十进制除法类似,仅仅是换用了二进制的减法和乘法规则,不再举例说明。