存储器校验
为什么要检验
电磁环境不稳定,会导致存储器电容的充电放电,造成数据丢失与错误。
怎么校验编码
合法代码集
将拿到的二进制编码与合法代码对比,能找出唯一一个最小的错位,就能纠错
编码的检测和纠错能力与合法代码集中任意两组代码之间位数差异的最小值有关:
- 差1位 - 检0、纠0
- 差2位 - 检1、纠0
- 差3位 - 检1、纠1
- 差4位 - 检2、纠1
- 差5位 - 检2、纠2
- …
目测规律是每多1位后的位差为偶数时,比上一级检测能力+1,奇数时,纠错能力+1
编码最小距离
任意两组代码之间位数差异的最小值有关,即编码最小距离(L)
L - 1 = D + C, D ≥ C
D是检测位数,C是纠错位数
汉明码
汉明码是一种采用奇偶校验1和分组校验2(非划分) 的具有1位纠错能力的二进制编码
可以根据对各组的校验结果比对和不同组的重叠元素快速定位到出错的位置上
![[汉明码示例图.excalidraw.svg]]
记组 P1(1,3,5,7), P2(2,3,6,7), P3(4,5,6,7) (这些数字只是标记一下位置)
假设最多只存在一位错误,对P1, P2 和 P3组的校验情况如下时:
P1 | P2 | P3 | 出错 | 说明 |
---|---|---|---|---|
0 | 0 | 0 | 无 | 无 |
1 | 0 | 0 | 1 | 只有P1错了,那必然只在P1独有的位置出错,即1 |
1 | 0 | 1 | 5 | P1和P3错了但P2没错,必然出错在仅P1和P3的交叉位置,即5 |
0 | 1 | 1 | 6 | P2和P3错了但P1没错,必然出错在仅P2和P3的交叉位置,即6 |
1 | 1 | 1 | 7 | P1,P2和P3都错了,必然错在3组的公共区域,即7 |
如何分组
对汉明码:二进制编码从右往左数,第几位为1就是第几组
求汉明码
- 求校验位数
新增检测位可以提高检测和纠错能力,记原代码长度n,为使其具有纠错能力,至少需要增加k位检测位,组成 n+k 位的新代码:
$2^k ≥ n + k + 1 $
如:0101,k=4,则需要3位校验码组成7位的汉明码
检测位Ci处于汉明码中 1,2,4…2^(k-1) 的位置:
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
名与值 | C 1 C_1 C1 | C 2 C_2 C2 | b 4 b_4 b4=0 | C 4 C_4 C4 | b 3 b_3 b3=1 | b 2 b_2 b2=0 | b 1 b_1 b1=1 |
- 组数:n
- 求每组( g i g_i gi)组员:组 g i g_i gi 读占有汉明码中第 2 i − 1 2^i-1 2i−1 位,组 g i g_i gi 和 组 g j g_j gj 公共独占 ( 2 i − 1 2^i-1 2i−1 + 2 j − 1 2^j-1 2j−1 ) 位,依次类推可得所有元素
- 根据奇偶校验,用异或运算求校验位:如组 g 1 g_1 g1 的 0 & 1 & 1,同0异1,得 1 & 1,得 0,以此类推
最终得 C 1 C_1 C1=0, C 2 C_2 C2=1, C 4 C_4 C4=0,汉明码为 0100101