1.3 数制与编码
1.3.1 数制
所谓“数制”就是计数的进制。在日常生活中,人们最熟悉的是十进制。由于数字信号只有“0”和“1”两个不同的状态,因此在计算机和数字电路中,常用的是二进制数。此外还有八进制数、十六进制数等,例如,25(10)=(11001)(2)=31(8)=19(16)。
(1)十进制数中的0~15所对应的不同数制的表示方法如表1.2所列。
表1.2 几种常用数制对照表
十进制是“满10进1”,对于任意一个十进制数,用多项式表示为:
上式中,ai=0、1、2、3、…、9,是10i位的系数,称为十进制数的基数;
n为整数部分的位数;
m为小数部分的位数。
例如,25(10)=2×101+5×100=20+5
(2)类似地,二进制数是“满2进1”,对于任意一个二进制数,用多项式表示为:
式中,ai=0、1,是2i位的系数,称为二进制数的基数;
n为整数部分的位数;
m为小数部分的位数。
例如,11001(2)=1×24+1×23+0×22+0×21+1×20=16+8+0+0+1=25(10)
1.3.2 不同数制间的转换
1.十进制数转换为二进制数、八进制数和十六进制数
转换的方法是:整数部分采用“除基取余”法。即将十进制数的整数部分逐次被基数N所除,每次除完后所得的余数便为要转换的数码,直到商为0时止。第1个余数为最低位,最后一个余数为最高位。小数部分则采用“乘基取整”法,即将十进制数的小数部分乘以基数C,乘积的整数部分作为N进制数的小数部分。第1个取出的整数为最高位,最后一个取出的整数为最低位。
例1.1 将十进制数29.437(10)转换成二进制数。
解:①整数部分29(10),采用“除2取余”法转换。
所以,29(10)=11101(2)
②小数部分0.437(10),采用“乘2取整”法转换。
所以,0.437(10)=0.01101(2)
由此可得:29.437(10)=11101.01101(2)
例1.2 将十进制数161.437(10)分别转换为八进制数和十六进制数。
解:①整数部分采用“除基取余”法,它们的基数分别为8和16。
所以,161(10)=241(8)=A1(16)
②小数部分转换采用“乘基取整”法
所以,0.437(10)=0.33757(8)=0.6FDF3(16)
由此可得:161.437(10)=241.33757(8)=A1.6FDF3(16)
2.二进制、八进制和十六进制数转换为十进制数
数码和位权值的乘积称为加权系数,各位加权系数相加的结果便为对应的十进制数。
例1.3 将10110.011(2)、621.34(8)、2AD.C7(16)分别转换为十进制数。
解:①10110.011=1×24+1×22+1×21+1×2-2+1×2-3=22.375(10)
②621.34(8)=6×82+2×81+1×80+3×8-1+4×8-2=401.4375(10)
③2AD.C7(16)=2×162+10×161+13×160+12×16-1+7×16-2=685.7773(10)
3.二进制数与八进制数、十六进制数间的相应转换
(1)二进制数与八进制数的相应转换。因为23=8,即每位八进制数由3位二进制数构成。所以整数部分从低位开始,每3位二进制数为一组,最后一组不是3位,则在最高位加0补足3位,然后用对应的八进制数来代替,再按原顺序排列与出对应的八进制数。
例1.4 将十进制数11011010.01110101(2)转换为八进制数。
解:
所以,11011010.01101(2)=332.325(8)
将每位八进制用3位二进制数来代替,再按原来的顺序排列起来,便得到了相应的二进制数。
例1.5 将八进制数651.463(8)转换为二进制数。
解:
所以,651.463(8)=110101001.100110011(2)
(2)二进制数和十六进制数间的转换。由于十六进制数的基数16=24,即每位十六进制数由4位十进制数构成。所以二进制数的整数部分从低位开始,每4位分为一组,最后一组不是4位时,则在高位加0补足4位为止。小数部分从高位开始,每4位二进制数为一组,最后一组不是4位时,在低位加0补足4位,然后用对应的十六进制数来代替,再按顺序写出对应的十六进制数。
例1.6 将二进制数10111011011.100101(2)转换成十六进制数。
解:
所以,10111011011.100101(2)=5DB.94(16)
例1.7 试将十六进制数4EB3.98D(16)转换成二进制数。
解:
所以,4EB3.98D(16)=100111010110011.100110001101(2)
1.3.3 编码
1.几种常用的编码
将十进制数的0~9十个数码用二进制数表示的代码,称为二-十进制编码,简称为BCD(Binary Coded Decimal)代码。由于4位二进制代码可以组成16种不同的组合,从中选出十种组合可以有多种方案,所以BCD码有多种方案。常见的BCD代码如表1.3所列。根据BCD码代码中每一位是否有固定的位权,可将其分为有权码和无权码两种类型。
表1.3 常见的BCD代码
(1)8421BCD码是常用的有权码,其4位二进制码从高位到低位的权依次是8、4、2、1,所以把这种代码叫做8421码。它具有简单、自然、容易识别的特点,在数字系统中得到广泛的应用。
(2)2421BCD码也是一种有权码,其4位二进制码从高位到低位的权依次为2、4、2、1。2421码不具备单值性,为了与十进制码一一对应,2421码不允许出现0101~1010的6种状态。2421码是一种对9的“自补代码”,这种特性有利于计算机中对十进制数的运算。
(3)余3码是由8421码加上0011形成的一种无权码。由于它的每个字符编码在数值上比相应的8421码多3,故称为余3码。在余3码中,十进制字符0和9、1和8、2和7、3和6、4和5的各码位互为相反,也是一种对9的“自补代码”,即对其按位求反就可求得对9的补码,因而也可给计算机运算带来方便。
2.可靠性编码
代码在形成和传输过程中难免要产生错误,为了使代码形成时不易出错,或者在出现错误时容易发现并进行校正,需要采用可靠性编码。常用的可靠性代码有格雷码、奇偶校验码等,分别如表1.4、表1.5所列。
表1.4 格雷码与二进制码对照表
表1.5 8421BCD奇偶校验码
(1)格雷码。格雷码是一种无权码,它有多种形式,典型4位格雷码的编码顺序如表1.4所列。它的特点是任意两组相邻代码之间只有一位不同,其余各位都相同,而最大数(2n-1)和0所对应的两组格雷码之间也只有一位代码不同,因此它是一种循环码。该特性使格雷码在产生和传输过程中引起的误差极小。如计数器每接收一个CP脉冲使输出状态更新,只有一位代码变化,显然减少了计数错误的概率。
(2)奇偶校验码。为了能及时发现和校正二进制信息在传送过程中可能出现的误码,提高设备的抗干扰能力,常采用奇偶校验码。它由两部分组成:一部分是需要传送的信息本身,是位数不限的二进制代码;其末尾数位是“1”的位数的奇偶校验位,其数值为0(或为1)对应信息码中“1”码的个数为奇数(或为偶数)。“1”码的个数为奇数称为奇校验,“1”码的个数为偶数称为偶校验,如表1.5所列。奇数个“1”校验码在传送过程中多一个“1”(或少一个“1”),就会变成偶数个“1”码,于是用奇校验电路就可以发现传送过程中的错误。同理,偶校验码在传送过程中出现的错误也会容易被发现。
3.二进制原码、补码和反码
(1)原码。原码又称“符号+绝对值”表示法。为了表示二进制数中的正、负数,用符号位加上数的绝对值的方法来表示,其中符号位“0”表示正数,“1”则表示负数。例如,(+45)10的原码可表示为(0101101)原,这里,最高位的0是代表正数的符号位,而后六位是代表45这个数的绝对值的二进制表示。又如,(-45)10的原码可表示为(1101101)原,最高位的1代表负号,后六位是代表数的绝对值。
例1.8 求(-28)10的原码表示形式。
解:(-28)10=(111100)原
(2)反码。反码又称“对1的补数”。其表示规则是:正数的二进制数反码表示同原码一样,负数的二进制数反码表示是符号位为1,数值位是各位取反。例如,(+45)10的反码表示同其原码一样,为(0101101)反;(-45)10的反码表示为(1010010)反。注意,这里除最高位为符号位外,其余位是数值位各位取反所得。
例1.9 求(-18)10的反码表示。
解:
(3)补码。补码又称为“对2的补数”。其表示规则是:正数的二进制数补码与其原码相同,负数的二进制数补码是符号位为1,数值位是将原码按位取反后末位加1所得。例如,(+45)10的补码为(0101101)补,表示同其原码一样;(-45)10的补码是在(-45)10的反码基础上末位加1,即表示为(1010011)补。
例1.10 求(-22)10的补码表示形式。
解:(+22)10=(010110)原
(-22)10=(101001)反
(-22)10=(101010)补