数字编码基础
进制转换
2,8与16进制之间的转换
二进制转换为八进制,从小数点起向左向右每三位为一组,按组转化为八进制。不足三位的,整数部分在最左,小数部分在最右以0补全。
整数部分二进制位的权值为4,2,1,小数部分为1/2,1/4,1/8(小数部分建议在分数下计算)。
三位二进制转化后八进制不足3位的要用0补全,待全部转化完成后再删去多余的0。八进制转二进制类似。
十六进制与二进制的转换类似,只不过四个一组。十六进制与八进制转化需要借助二进制。
小数点向左右,分组转换,位数补齐,最后删0
非十进制转换为十进制
非十进制转换为十进制时采用整数和小数部分都采用按权展开的方法。
十进制转换为非十进制
十进制数转换为非十进制数将整数部分与小数部分分别转换。
整数部分采取除R取余法,小数部分采取乘R取整法。
示例:
(11.375)D -> ?B
整数部分除以R,得到商和余数。商继续除以R,直到最后商为0为止。最后,将所有的余数倒序即得到整数部分。
11 / 2 = 5 ... 1
5 / 2 = 2 ... 1
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
整数部分: 1011
小数部分每次乘R,得到个位和小数部分。将小数部分继续乘R直到小数部分为0或达到精度为止。将所有整数部分按原顺序排列即得到转换后的小数。
0.375 * 2 = 0.750 ... 0
0.750 * 2 = 1.500 ... 1
0.500 * 2 = 1.000 ... 1
小数部分: 0.011
可以通过逆向转换来检验
数值编码
原生二进制在数值编码中被称为原码。
BCD码编码
BCD(Binary Coded Decimal)是采用二进制码元表示十进制数的编码。
BCD码分为无权码和有权码。若编码的每一位都有固定的权值则为有权码,否则为无权码。
8421BCD码的各位权值由左到右分别为8,4,2,1;虽然与自然二进制码相同,但8421BCD码只有前10个码组。
类似的有权码还有5421BCD码,2421BCD码等。5421BCD首位为0时最大表示4,而自然二进制可以表示7。即:
(4)D = (0100)5421;(5)D = (1000)5421
2421BCD码的存在两种加权方式(1,3位调换后表示同样的十进制数),可以采用首位为0末三位最大表示4后进位的方式。
余3码是8421BCD码加上0011得到的,余3码属于无权码。
BCD码与自然二进制的区别在于:四位BCD码最大表示9D,而四位自然二进制码最大表示15D。
格雷(Gray)码
格雷码要求任何相邻的两个码组只有一个码元不同,首编码和尾编码之间也只有一个码元不同。
两个码组中不同码元的个数叫做码组之间的距离,因为格雷码任意相邻码组间距离为1,所以格雷码是单位距离码;因为格雷码首尾距离也为1,所以格雷码也叫循环码。格雷码属于无权码。
格雷码采用递推的方式构造:
(1) 一位格雷码为(0,1)或(1,0)
(2) (n+1)位格雷码中前2^n个码组为前缀0加n位格雷码的码组,按顺序书写
(3) (n+1)位格雷码中前2^n个码组为前缀1加n位格雷码的码组,按逆序书写
补码 与 移码
原码表示带符号数时一般以最高位作为符号位,0为正1为负。
这样带来的问题是存在+0和-0两个0值,且相减无法与加负数统一处理。为了解决这些问题引入补码。
补码定义:
整数:
纯小数:
由上式可知,正纯小数个位为0,负纯小数个位为1。
原码、反码与补码转换:
原码与反码互转: 符号位不变,其它位取反
反码转补码: 0的补码为000...
,与-2^n的补码为100...
其它的按算术法则+1
补码转反码: 除000...
与100...
特殊处理外,其它的按算术法则-1
补码转移码互转:符号位取反
校验码
奇偶校验码
奇偶校验码是可以检测一位错误的编码,它由信息位和校验位两部分组成。校验位只有一位,可以放在信息位前或信息位后。
奇偶校验分为奇校验和偶校验,奇校验要求信息位和校验位中"1"的位数之和为奇数,偶校验则要求为偶数。通过检验位数和是否与约定相符可以判断是否在传输中出错。
海明码(Hamming Code)
Hamming Code在奇偶校验上升级而来。
编码过程(以以奇校验为例):
(1) 从最左侧开始对原码数据位标号,将标号转为2进制。
(2) 数据位中所有2的幂次方位(1,2,4,8...),即2进制位数标号中有且只有一个1的位数,作为校验位。
(3) 校验位1覆盖位数标号最后一位是1的数据位:1,11,101,111,1001,...
校验位2覆盖位数标号倒数第2位为1的数据位:10,11,110,111,1010,...
以此类推
(4)根据奇偶校验规则,根据校验位覆盖的数据位确定校验位。
示例:
原码: 10011101
确定校验位置: __1_001_1101
确定校验位(偶校验):
校验位1: 1 0 1 1 0 -> 1
校验位10: 1 0 1 1 0 -> 1
校验位100: 0 0 1 1 -> 0
校验位1000: 1 1 0 1 -> 1
Hamming码: 1 1 1 0 001 1 1101
校验位已加粗
循环冗余校验
循环冗余校验(Cyclic Redundancy Code, CRC)是利用模2除法进行校验和纠错的编码方式。
模2除法:
和算术除法非常类似
编码流程:
(1)先选择校验用除数,随机选择或者按生成多项式选择
(2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据编码(假设为m位)后面加上k-1位"0"。
然后以这个加了k-1个"0"的新编码(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数就是该编码的CRC校验码,也称之为FCS(帧校验序列)。
余数的位数一定比除数位数(k)只能少一位(k-1),最左侧的0不能省略。
(3) 再把这个校验码附加在原数据编码(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,作为最终编码发送。
关于生成多项式,并不是任何一个r次的多项式都可以作为生成多项式。从检错及纠错的要求出发,生成多项式应能满足下列要求:
(1) 任何一位发生错误应当使余数不为0;
(2) 不同位发生错误应当使余数不同;
(3) 对余数继续作模2除,应使余数循环
解码与纠错:
接收端再把接受到的编码以"模2除法"方式除以前面选择的除数。
如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。
余数与出错的位数满足如下关系:
数据的浮点表示
浮点数可以表示为F = M * R ^ E,
-
M称为尾数,尾数一般是带有符号位的纯小数。
-
R为进制基数
-
E称为为阶码
非规格浮点数
取R = 2, E为k位补码表示, M为n位补码表示。
则,阶码的取值为[-2^k, 2k-1],尾码取值为[-2(-n),-1]∪[2(-n),1-2(-n)]
所以,非规格化浮点数表示范围为:
[ -1 * 2 ^ (2 ^ k - 1) , - 2 ^ (- n) * 2 ^ (- 2 ^ k )] ∪ [ 2 ^ (- n) * 2 ^ (- 2 ^ k ), (1 - 2 ^ (-n) )* 2 ^ (2 ^ k - 1) ]
规格化浮点数
规格化浮点数是使尾数处于一定范围,以提高精度的方法。
在R = 2时,一般使得尾数绝对值在1/2~1之间,这可以通过移位的方式解决。
那么,规格化位数的取值范围为:
[-1 * 2 ^ (2 ^ k - 1), - (1/2 + 2) ^ (- n) * 2 ^ (- 2 ^ k )]∪ [ (1/2) * 2 ^ (- 2 ^ k ), (1 - 2 ^ (-n) )* 2 ^ (2 ^ k - 1) ]