1.2 几种简单的编码
编码就是用一组特定的符号表示数字、字母或文字,这一组符号叫做代码。一个n位的二进制码有2n种不同的0、1组合,每种组合都可以代表一个编码的元素。尽管给2n个不同的信息元素编码最少需要n位二进制数,但对于一组二进制编码来说,它所用的位数是没有最大值的。例如:一个四元素集可以用两位来编码,每个元素唯一对应00,01,10,11中的某一个;也可以用4位来编码,编码为0001,0010,0100,1000;或者编码为1110,1101,1011,0111;只要给每个元素分配一个唯一的数组,在集合中不发生混淆即可。
1.2.1 二-十进制码(BCD码)
在目前的数字系统中,一般是采用二进制数进行运算的,但是由于人们习惯采用十进制数,因此常需进行十进制数和二进制数之间的转换,其转换方法上面已讨论过了。为了便于数字系统处理十进制数,经常还采用编码的方法,即以若干位二进制码来表示1位十进制数,这种代码称为二进制编码的十进制数,简称二-十进制码,或BCD码(Binary Coded Decimal Codes)。
因为十进制数有0~9共10个计数符号,为了表示这10个符号中的某一个,至少需要4位二进制码。4位二进制码有24=16种不同组合,我们可以在16种不同的组合代码中任选10种表示十进制数的10个不同计数符号。根据这种要求可供选择的方法是很多的,选择方法不同,就得到不同的编码形式。常见的有8421码、5421码、2421码和余3码等,如表1.2所示。
1.有权BCD编码
有权BCD编码是以代码的位权值来命名的。在表1.2中,8421码、5421码和2421码为有权码。在这些表示0~9共10个数字的4位二进制代码中,每位数码都有确定的位权,因此可以根据位权展开求得代码所代表的十进制数字。例如,对8421码而言,二进制码各位的权从高位到低位依次为8,4,2,1,如(0110)8421BCD所代表的十进制数为:0×8+1×4+1×2+0×1=6。又例如,对5421码而言,二进制码各位的权从高位到低位依次为5,4,2,1,所以(1010)5421BCD所代表的十进制数为:
1×5+0×4+1×2+0×1=7
在有权码中,8421码是最常用的,这是由于8421码的每位权的规定和二进制数是相同的,因此8421码对十进制的10个计数符号的表示与普通二进制数是一样的,这样便于记忆。但是要注意,在8421码中不允许出现1010~1111这六种代码。
对于5421和2421码,它们的编码形式不是唯一的,表1.2中仅列出了其中的一种。例如,数字6的2421编码可以是1100和0110;数字7的5421编码可以是0111和1010。一般采用如表1.2中所示5421和2421的编码形式。
表1.2 常用BCD码
【例1.12】 用8421BCD码表示十进制数(67.58)10。
故(67.58)10=(01100111.01011000)8421BCD。
有权的BCD码除了上述的8421码、5421码、2421码外,还有其他多种形式,如7421码、5311码等,甚至还有负权码的形式,如具有两位负权值的84(-2)(-1)码等。这些有权BCD码的编码方式及等值十进制数的计算方法和以上介绍的8421码、2421码的构成方法是一样的。
2.无权BCD码
无权码的每位无确定的权,因此不能用按权展开的方法来求它所代表的十进制数。无权码在数字系统中不能进行数值运算。但是这些代码都有其特点,在不同的场合可以根据需要选用。在表1.2中,余3 BCD码属无权码,它是在每个对应的8421BCD代码上加(3)10=(0011)2而得到的。例如,十进制数6在8421BCD码中为0110,将它加(3)10,得到的1001即为十进制数6的余3码。在余3码的编码中,十进制数0和9、1和8、2和7、3和6、4和5对应位的码互为反码(一个是0,另一个是1),具有这种特性的代码称为自反代码。在表1.2中的2421码也是自反代码,但需注意,不是所有的2421码都是自反代码。
相对二进制、八进制、十进制、十六进制来说,BCD码不是一种新的计数体制。事实上,它是将十进制数中的每个数字都用二进制数来进行编码。还要注意的是,BCD码与直接的二进制数不同,一个二进制数对应的是一个十进制数的整体,而BCD码则是分别把每一位十进制数转换为二进制数。例如:
(137)10=(10001001)2
(137)10=(0001 0011 0111)8421BCD=(0100 0110 1010)余3BCD
比较上面两个式子可以发现,用BCD码表示(137)10需要12位,而用二进制数表示仅需要8位。正如前面指出的那样,由于BCD码没有使用所有可能的4位编码组合,因此利用率较低,当需要表示的十进制数多于1位时,BCD码比直接用二进制数表示要求有更多的位数。
BCD码的最大优点是容易实现与十进制数的相互转换,仅需记忆十进制数0~9所对应的4位二进制编码。在数字系统中,十进制数与BCD码的相互转换要依靠逻辑电路来实现。因此,从硬件的角度来看,容易转换是十分重要的。
1.2.2 格雷码
格雷码(Gray码)是一种常见的无权码,其编码如表1.3所示。这种码的特点是:相邻两个代码之间仅有1位不同,其余各位均相同。具有这种特点的码称为循环码,故格雷码是一种循环码。格雷码的这个特点使它在代码形成与传输中引起的误差较小。例如在模拟量到数字量的转换设备中,当模拟量发生微小变化而可能引起数字量发生变化时,格雷码仅改变1位,这样与其他码同时改变2位或多位的情况相比更为可靠,即减小了出错的可能性。
表1.3 格雷码与二进制码的关系对照表
假定n位二进制码为Bn…B1B0,n位格雷码为Rn…R1R0,则两码之间的关系为:
Rn=BnRi=Bi+1⊕Bi i≠n
Bn=RnBi=Bi+1⊕Ri i≠n
式中,“⊕”为异或运算符。异或运算的详细内容见1.4节。
格雷码无固定的“权”,因而在数字系统中不能直接进行计算;如需要进行计算,则需先把循环码转换成普通的二进制码,这是它的缺点。
1.2.3 奇偶校验码
信息的正确性对数字系统和计算机有极其重要的意义,但在信息的存储与传送过程中,常由于某种随机干扰而发生错误。所以希望在传送代码时能进行某种校验以判断是否发生了错误,甚至能自动纠正错误。
奇偶校验码是一种具有检错能力的代码,它是在原代码(称为信息码)的基础上增加一个码位(称为校验码、校验位或附加位),使代码中含有的1的个数均为奇数(称为奇校验)或偶数(称为偶校验),这样通过检查代码中含有的1的数目的奇偶性来判别代码的合法性。显然,信号在传送过程中如果代码有两位出错,则这种奇偶校验法是无法检测的,因为两位出错不会改变代码中含1码个数的奇偶性。所以,奇偶校验码仅适用于信号出错率很低,且出现成对错误的概率基本为0的情况。
表1.4给出了由8421BCD码变换而得到的奇偶校验码。表中最高位为校验位。
表1.4 奇偶校验码
1.2.4 字符数字码
除了数字数据外,计算机还必须能处理非数字信息。即计算机应能识别表示字母、标点符号和其他特殊符号以及数字的代码。这些代码叫做字符数字码。一个完整的字符数字码应包括26个小写英文字母、26个大写英文字母、10个数字符号、7个标点符号,以及其他20~40个特殊符号,如+、/、#、%、*等。也就是说,字符数字码能表示计算机键盘上所看到的各种符号和功能键。
美国信息交换的标准代码(简称ASCII)是应用最为广泛的字符数字码。ASCII码是7位码,因此有27=128种可能的代码组合。这足以表示标准键盘的字符、回车、换行等控制功能。表1.5列出了部分ASCII码,对于每一个符号,表中不仅给出了二进制码,而且给出了等值的八进制数和十六进制数。
表1.5 部分ASCII码表
ASCII码是7位码,但在大多数计算机中ASCII字符通常要用一个字节来存储,每个字节中多余的1位(最左边1位)可以做其他用途,这取决于实际应用。例如,将最高有效位设置为0,可以认为是8位的ASCII码;而最高有效位设置成1,则这128个8位码可以用来表示希腊字母或斜体字符号等。