字符编码
ASCII
7位二进制编码,占用1个字节
字符数:128
UTF-8
有效位数 | 字节1 | 字节2 | 字节3 | 字节4 | 字节5 | 字节6 |
---|---|---|---|---|---|---|
7 | 0ddddddd |
/ | / | / | / | / |
11 | 110ddddd |
10dddddd |
/ | / | / | / |
16 | 1110dddd |
10dddddd |
10dddddd |
/ | / | / |
21 | 11110ddd |
10dddddd |
10dddddd |
10dddddd |
/ | / |
26 | 111110dd |
10dddddd |
10dddddd |
10dddddd |
10dddddd |
/ |
31 | 1111110d |
10dddddd |
10dddddd |
10dddddd |
10dddddd |
10dddddd |
好处:
- 变长编码
- 字符长度由首字节确定
- 可以自同步(首字节一定不同于后续字节!)
- 可扩展性强
字体表示
- 点阵字体
- 矢量字体
数值表示
整数(定点数)
- 正数:全部相同
- 原码:符号位为1,后跟绝对值
- 反码:
x_neg = ~(x_pos)
- 补码:
x_neg = ~(x_pos) + 1
需要知道的内容:零扩展/符号扩展、大端/小端
浮点数 IEEE 754 标准
符号位$s$、阶码exp
、尾数frac
类型 | 阶码 | 尾数 | $E$ | $M$ |
---|---|---|---|---|
非规格化数 | 全0 |
任意 | 1 - Bias |
0.frac |
规格化数 | 不是全0 或全1 |
任意 | exp - Bias |
1.frac |
无穷大 | 全1 |
全0 |
/ | / |
NaN | 全1 |
非全0 |
/ | / |
其中Bias
为偏置量,其中为阶码位数
简单的记忆方式:最小有效阶码和最大有效阶码的平均数
浮点数运算的基本方法
- 计算阶码
- 尾数移位(仅加减法)
- 计算尾数
- 规格化
- 舍入,可能再次进行规格化
- 进行阶码溢出检查
浮点数的特点
- 加法不可结合
- “判等”不完全可信
检验纠错码
码距(最小码距):合法码之间最小的二进制位差异数目
码距为1的编码没有纠错能力
奇偶校验码
增加一位使1
为奇(偶)数个
海明校验码
动机:k个数据位和r个校验位,使得k+r位中任何一位出错可以发现并改正,任何两位同时出错可以发现,但不能改正
思路:保证每个数据位对应不同的校验位组合
于是有,(为什么+1?因为r位全部正确的情形不能用来表示错误)
增加一位用以区分一位错和两位错:
海明码实现方案
校验位安排
- 数据位、校验位从1开始统一编号
- 在1、2、4、8、…位放置校验位
- 预留一位校验位作为总校验位放在最后
如对,排序为
其中$P_4$为总校验位
校验位组合
- 将数据位的编号写成2的幂的和
- 校验位为所有含有此2的幂的数据位的异或
- 总校验位为其他所有位的异或
对上面的例子,有
译码方案
- 计算S位:把校验位和对应的位异或
- 若S位含
1
则出现错误
若至多两位出错,则S位分为以下三种情况:
- 四位S全为零,则无错
- 为1,其他不全零,则一位错,其他三位对应2的幂求和的位置即为出错的位
- 为0,其他不全零,则两位错
海明码的码距为4