1.5 几种常用的编码
在数字系统中,用预先规定的方法将文字、数字或其他对象编成二进制的数码,这种给信息分配的二进制代码称为对信息的编码。
1.5.1 二-十进制编码
在数字系统中,各种数据要转换为二进制代码才能进行处理,而人们习惯于使用十进制数,所以在数字系统的输入输出中仍采用十进制数,这样就产生了用4位二进制数表示1位十进制数的方法。这种二进制代码称为二-十进制代码(Binary Coded Decimal),简称为BCD码。
十进制数有0~9共10个数码,所以表示1位十进制数,至少需要4位二进制数,但4位二进制数可以产生24=16种组合,因此用4位二进制数表示1位十进制数,有6种组合是多余的。因而,十进制数的二进制编码可以有许多种编码方案,每种编码都有它的特点。表1-2列举了目前常用的几种编码。
表1-2 常用的十进制代码
8421码是十进制代码中最简单、最常用的一种编码。这种编码是将每个十进制数码用4位二进制数表示,按自然二进制数的规律排列,并且指定前面10个代码依次表示数码0~9。8421码是一种有权码,每位都有固定的权。各位的权从左到右分别是8、4、2、1,其按权展开式为
N=a3W3+a2W2+a1W1+a0W0 (1-8)
式(1-8)中:a3、a2、a1、a0为各位的代码;W3、W2、W1、W0为各位的权值。8421码的权为W3=8、W2=4、W1=2、W0=1。例如,8421码0110的按权展开式为0×8+1×4+1×2+0×1=6,因而,代码0110表示十进制数码6。8421码对应十进制的10个数码的表示与普通二进制中的表示完全一样,很容易实现彼此之间的转换。必须指出,在8421码中不允许出现1010~1111这几个代码,因为在十进制中没有数码同它们对应。
【例1-9】把下面的十进制数转换为8421码。
(a)25 (b)89 (c) 150 (d)3269
解:(a)(25)10=(00100101)8421; (b)(89)10=(10001001)8421;
(c)(150)10=(000101010000)8421; (d)(3269)10=(0011001001101001)8421。
2421码和8421码相似,也是一种权码,它用4位二进制表示1位十进制数,所不同的是2421码的权从左到右分别为2,4,2,1,即其权为W3=2,W2=4,W1=2,W0=1。例如,2421的1100,其按权展开式为1×2+1×4+0×2+0×1=6,因而,代码1100表示十进制数码6。2421是一种“对9的自补”代码。在这种编码中,十进制数0和9、1和8、2和7、3和6、4和5的对应码位,互为补码。
余3码是一种特殊的8421码,它是由8421码加3后形成的,所以叫余3码。例如,十进制数4在8421BCD码中是0100,在余3码中就成为0111。余3码的各位无固定的权。
5211码是另一种恒权代码。余3循环码是一种变权码,每一位的1不代表固定的值,它主要特点是相邻的两个代码之间仅有一位状态不同。因此,按余 3 循环码接成的计数器,每次状态转换过程中只有一个触发器翻转,译码不会产生竞争冒险现象(参看第6章)。
【例1-10】把下面的十进制数转换为余3码。
(a)25 (b)89 (c) 150 (d)3269
解:(a)(25)10=(01011000)余3; (b)(89)10=(10111100)余3;
(c)(150)10=(010010000011)余3; (d)(3269)10=(0110010110011100)余3
1.5.2 可靠性编码
代码在数字系统或者计算机中形成及传送的过程中都可能发生错误,为使代码不易出错,或者出错时容易发现,甚至能查出错误的位置,除提高计算机本身的可靠性外,人们还采用可靠性编码实现。
目前,常用的可靠性编码有格雷(Gray)码和奇偶校验码。下面分别介绍这两种代码的组成及特点。
1.格雷码
格雷码又叫循环码。从表 1-3 的 4 位格雷码编码表中可以看出格雷码的构成方法,就是每一位的状态变化都按一定的顺序循环。如果从0000开始,最右边一位的状态按0110顺序循环变化,右边第二位的状态按 00111100 顺序循环变化,右边第三位 0000111111110000 顺序循环变化。可见,自右向左,每一位状态循环中连续的0、1数目增加一倍。由于4位格雷码只有16个,所以最左边一位的状态只有半个循环,即0000000011111111。按照上面的原则,我们很容易得到更多位数的格雷码。
表1-3 4位格雷码与二进制代码的比较
格雷码最大的特点就是任意两个相邻的数字代码之间仅有一位不同,其余各位均相同。在数字系统中,经常要求代码按一定顺序变化,例如按自然规律计数。如果用普通二进制对十进制数进行编码,则进行二进制加法计数时,十进制数从5到6,其相应的二进制代码从0101变到0110,二进制代码 0101 的最低两位都要改变。若两位的变化不是同时发生(在实际电路中,没有绝对的同时发生),那么,在计数过程中就可能短暂地出现其他代码(0111或0100),尽管这种误码出现时间是短暂的,但在有些情况下却是不允许的,因为这可能导致电路状态错误或输出错误。若采用格雷码,由于相邻两个代码只有一位不同,故不可能跳变到其他代码,从而可避免出现这种错误。
2.奇偶校验码
奇偶校验码是一种能检验出二进制信息在传送过程中出现错误的代码。这种代码由两部分组成:一部分是信息位,即需要传送的信息本身;另一部分是奇偶校验位,加上校验码后使整个代码中1的个数按预先的规定成为奇数或偶数。当信息位和校验位中1的总个数为奇数时,称为奇校验,而1的总个数为偶数时,称为偶校验。由4位信息位及1位奇偶校验位构成的5位奇偶校验码如表1-4所示。
表1-4 十进制数码的奇偶校验码
这种编码的特点是:是每一个代码中含有 1 的个数总是奇(偶)数个。这样,一旦某代码在传送过程中出现1的个数不是奇(偶)数时,就会被发现。
必须指出,奇偶校验码只能发现代码的一位(或奇数位)出错,而不能发现两位(或偶数位)出错。由于两位出错的概率远低于一位出错的概率,所以用奇偶校验码来检测代码在传送过程中的错误是有效的。
1.5.3 字符代码
计算机处理的数据不仅有数字,还有字母、标点符号、运算符号及其他特殊符号。这些数字、字母和专用符号统称字符。字符都必须用二进制代码来表示。它们的编码称为字符代码。
美国信息交换标准码(American Standard Code for Information Interchange,ASCII)是由美国国家标准学会(American National Standard Institute,ANSI)制定的一种常用的字符代码。它已被国际标准化组织(International Organization for Standardization,ISO)确定为国际标准。ASCII码用7位二进制数表示128种不同的字符,其中有96个图形字符。它们是26个大写英文字母和26个小写英文字母,10个数字符号,34个专用符号,此外还有32个控制字符,具体如表1-5所示。ASCII码中控制码的含义如表1-6所示。
表1-5 7位ASCII码编码表
表1-6 ASCII码中控制码的含义
计算机中实际用8位二进制代码表示一个字符,称为一个字节。通常在7位标准码的左边最高位填入奇偶校验位,它可以是奇校验,也可以是偶校验。这种编码的好处是低 7 位仍然保持 7 位标准码的编码,高位奇偶校验位不影响计算机内部处理和输入输出规则。此外,还有直接采用8位二进制代码进行编码的EBCDIC码,称为扩充的BCD码。