[计算机组成原理]快速理解汉明码

快速理解汉明码

下面以10位数据位举例。

生成校验码

现在有一串二进制数据现在需要生成汉明码:
D 10 D 9 D 8 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D_{10} D_9 D_8 D_7 D_6 D_5 D_4 D_3 D_2 D_1 D10D9D8D7D6D5D4D3D2D1
下面是步骤。

  1. 在位号为 2 n − 1 2^{n-1} 2n1的位置插入校验位。
    D 10 D 9 D 8 D 7 D 6 D 5 P 4 8 D 4 D 3 D 2 P 3 4 D 1 P 2 2 P 1 1 D_{10} D_9 D_8 D_7 D_6 D_5 \underset{8}{P_4} D_4 D_3 D_2 \underset{4}{P_3} D_1 \underset{2}{P_2} \underset{1}{P_1} D10D9D8D7D6D58P4D4D3D24P3D12P21P1
  2. 查表后知道需要在第1步的基础上要在末尾添加附加校验位。
数据位数量最小校验位数量
1~34
4~105
11~256
26~567
57~1198

P 5 15 D 10 D 9 D 8 D 7 D 6 D 5 P 4 8 D 4 D 3 D 2 P 3 4 D 1 P 2 2 P 1 1 \underset{15}{P_5} D_{10} D_9 D_8 D_7 D_6 D_5 \underset{8}{P_4} D_4 D_3 D_2 \underset{4}{P_3} D_1 \underset{2}{P_2} \underset{1}{P_1} 15P5D10D9D8D7D6D58P4D4D3D24P3D12P21P1
3. 校验位的位号是不重要的,数据位的位号才是重要的。
P 5 D 10 14 D 9 13 D 8 12 D 7 11 D 6 10 D 5 9 P 4 D 4 7 D 3 6 D 2 5 P 3 D 1 3 P 2 P 1 P_5 \underset{14}{D_{10}} \underset{13}{D_9} \underset{12}{D_8} \underset{11}{D_7} \underset{10}{D_6} \underset{9}{D_5} P_4 \underset{7}{D_4} \underset{6}{D_3} \underset{5}{D_2} P_3 \underset{3}{D_1} P_2 P_1 P514D1013D912D811D710D69D5P47D46D35D2P33D1P2P1
4. 位号改写为二进制形式。
P 5 D 10 1110 D 9 1101 D 8 1100 D 7 1011 D 6 1010 D 5 1001 P 4 D 4 111 D 3 110 D 2 101 P 3 D 1 11 P 2 P 1 P_5 \underset{1110}{D_{10}} \underset{1101}{D_9} \underset{1100}{D_8} \underset{1011}{D_7} \underset{1010}{D_6} \underset{1001}{D_5} P_4 \underset{111}{D_4} \underset{110}{D_3} \underset{101}{D_2} P_3 \underset{11}{D_1} P_2 P_1 P51110D101101D91100D81011D71010D61001D5P4111D4110D3101D2P311D1P2P1
5. 二进制的位号的数字的低位起第1位对应 P 1 P_1 P1,第2位对应 P 2 P_2 P2,以此类推,附加校验位 P 5 P_5 P5除外。

P 5 P_5 P5 D 10 D_{10} D10 D 9 D_9 D9 D 8 D_8 D8 D 7 D_7 D7 D 6 D_6 D6 D 5 D_5 D5 P 4 P_4 P4 D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 P 3 P_3 P3 D 1 D_1 D1 P 2 P_2 P2 P 1 P_1 P1
- 1 P 4 1 P 3 1 P 2 0 \underset{P_4}{1} \underset{P_3}{1} \underset{P_2}{1} 0 P41P31P210 1 P 4 1 P 3 0 1 P 1 \underset{P_4}{1} \underset{P_3}{1} 0 \underset{P_1}{1} P41P310P11 1 P 4 1 P 3 00 \underset{P_4}{1} \underset{P_3}{1} 0 0 P41P3100 1 P 4 0 1 P 2 1 P 1 \underset{P_4}{1} 0 \underset{P_2}{1} \underset{P_1}{1} P410P21P11 1 P 4 0 1 P 2 0 \underset{P_4}{1} 0 \underset{P_2}{1} 0 P410P210 1 P 4 00 1 P 1 \underset{P_4}{1} 0 0 \underset{P_1}{1} P4100P11- 0 1 P 3 1 P 2 1 P 1 0 \underset{P_3}{1} \underset{P_2}{1} \underset{P_1}{1} 0P31P21P11 0 1 P 3 1 P 2 0 0 \underset{P_3}{1} \underset{P_2}{1} 0 0P31P210 0 1 P 3 0 1 P 1 0 \underset{P_3}{1} 0 \underset{P_1}{1} 0P310P11- 00 1 P 2 1 P 1 0 0 \underset{P_2}{1} \underset{P_1}{1} 00P21P11--
  1. 改写成另一种竖写的形式。
检验位
数据位
P 5 P_5 P5 D 10 D_{10} D10 D 9 D_9 D9 D 8 D_8 D8 D 7 D_7 D7 D 6 D_6 D6 D 5 D_5 D5 P 4 P_4 P4 D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 P 3 P_3 P3 D 1 D_1 D1 P 2 P_2 P2 P 1 P_1 P1
P 1 P_1 P1-010101-101-1--
P 2 P_2 P2-100110-110-1--
P 3 P_3 P3-111000-111-0--
P 4 P_4 P4-111111-000-0--
  1. 我们首先根据位号的二进制位确定好 P 1 P_1 P1 P 4 P_4 P4要校验的位然后可以发现有些列的和为 2 2 2,有些列的和为 3 3 3(-表示0)。我们补充 P 5 P_5 P5,使所有列的和为 3 3 3
检验位
数据位
P 5 P_5 P5 D 10 D_{10} D10 D 9 D_9 D9 D 8 D_8 D8 D 7 D_7 D7 D 6 D_6 D6 D 5 D_5 D5 P 4 P_4 P4 D 4 D_4 D4 D 3 D_3 D3 D 2 D_2 D2 P 3 P_3 P3 D 1 D_1 D1 P 2 P_2 P2 P 1 P_1 P1
P 1 P_1 P1-010101-101-1--
P 2 P_2 P2-100110-110-1--
P 3 P_3 P3-111000-111-0--
P 4 P_4 P4-111111-000-0--
P 5 P_5 P5---1-11--11-1--
  1. 上表中,1表示要参与异或计算,0和-表示不用。之后可以确定下列计算式(即偶校验)(其中 ⊗ \otimes 为异或运算)(若数据位的数量比10小,为9、8等则下列各表达式中参与计算的位的数量是不相等的)。
    { P 1 = D 9 ⊗ D 7 ⊗ D 5 ⊗ D 4 ⊗ D 2 ⊗ D 1 P 2 = D 10 ⊗ D 7 ⊗ D 6 ⊗ D 4 ⊗ D 3 ⊗ D 1 P 3 = D 10 ⊗ D 9 ⊗ D 8 ⊗ D 4 ⊗ D 3 ⊗ D 2 P 4 = D 10 ⊗ D 9 ⊗ D 8 ⊗ D 7 ⊗ D 6 ⊗ D 5 P 5 = D 8 ⊗ D 6 ⊗ D 5 ⊗ D 3 ⊗ D 2 ⊗ D 1 ① \begin{cases} P_1 = D_9 \otimes D_7 \otimes D_5 \otimes D_4 \otimes D_2 \otimes D_1 \\ P_2 = D_{10} \otimes D_7 \otimes D_6 \otimes D_4 \otimes D_3 \otimes D_1 \\ P_3 = D_{10} \otimes D_9 \otimes D_8 \otimes D_4 \otimes D_3 \otimes D_2 \\ P_4 = D_{10} \otimes D_9 \otimes D_8 \otimes D_7 \otimes D_6 \otimes D_5 \\ P_5 = D_8 \otimes D_6 \otimes D_5 \otimes D_3 \otimes D_2 \otimes D_1 \end{cases} ① P1=D9D7D5D4D2D1P2=D10D7D6D4D3D1P3=D10D9D8D4D3D2P4=D10D9D8D7D6D5P5=D8D6D5D3D2D1
  2. 将计算的值组装到第2步里,得到汉明码。
    P 5 D 10 D 9 D 8 D 7 D 6 D 5 P 4 D 4 D 3 D 2 P 3 D 1 P 2 P 1 P_5 D_{10} D_9 D_8 D_7 D_6 D_5 P_4 D_4 D_3 D_2 P_3 D_1 P_2 P_1 P5D10D9D8D7D6D5P4D4D3D2P3D1P2P1

校验

  1. 计算下式。
    { S 1 = P 1 ⊗ D 9 ⊗ D 7 ⊗ D 5 ⊗ D 4 ⊗ D 2 ⊗ D 1 S 2 = P 2 ⊗ D 10 ⊗ D 7 ⊗ D 6 ⊗ D 4 ⊗ D 3 ⊗ D 1 S 3 = P 3 ⊗ D 10 ⊗ D 9 ⊗ D 8 ⊗ D 4 ⊗ D 3 ⊗ D 2 S 4 = P 4 ⊗ D 10 ⊗ D 9 ⊗ D 8 ⊗ D 7 ⊗ D 6 ⊗ D 5 S 5 = P 5 ⊗ D 8 ⊗ D 6 ⊗ D 5 ⊗ D 3 ⊗ D 2 ⊗ D 1 ② \begin{cases} S_1 = P_1 \otimes D_9 \otimes D_7 \otimes D_5 \otimes D_4 \otimes D_2 \otimes D_1 \\ S_2 = P_2 \otimes D_{10} \otimes D_7 \otimes D_6 \otimes D_4 \otimes D_3 \otimes D_1 \\ S_3 = P_3 \otimes D_{10} \otimes D_9 \otimes D_8 \otimes D_4 \otimes D_3 \otimes D_2 \\ S_4 = P_4 \otimes D_{10} \otimes D_9 \otimes D_8 \otimes D_7 \otimes D_6 \otimes D_5 \\ S_5 = P_5 \otimes D_8 \otimes D_6 \otimes D_5 \otimes D_3 \otimes D_2 \otimes D_1 \end{cases} ② S1=P1D9D7D5D4D2D1S2=P2D10D7D6D4D3D1S3=P3D10D9D8D4D3D2S4=P4D10D9D8D7D6D5S5=P5D8D6D5D3D2D1
    提示:假如数据没有出错,那么可以将①式代入②式得到
    { S 1 = P 1 ⊗ P 1 = 0 S 2 = P 2 ⊗ P 2 = 0 S 3 = P 3 ⊗ P 3 = 0 S 4 = P 4 ⊗ P 4 = 0 S 5 = P 5 ⊗ P 5 = 0 \begin{cases} S_1 = P_1 \otimes P_1 = 0 \\ S_2 = P_2 \otimes P_2 = 0\\ S_3 = P_3 \otimes P_3 = 0\\ S_4 = P_4 \otimes P_4 = 0\\ S_5 = P_5 \otimes P_5 = 0 \end{cases} S1=P1P1=0S2=P2P2=0S3=P3P3=0S4=P4P4=0S5=P5P5=0
    若有任意一位数据位翻转(0变1或1变0),都会导致有3个校验位翻转。
  2. 现在分析 S 5 S 4 S 3 S 2 S 1 S_5 S_4 S_3 S_2 S_1 S5S4S3S2S1
S 5 + S 4 + S 3 + S 2 + S 1 S_5 + S_4 + S_3 + S_2 + S_1 S5+S4+S3+S2+S1描述(分行表示或)
0数据无错
11个校验位出错
3个位出错(包括校验位和数据位)
22个位出错
31个数据位出错(可纠错)
3个校验位出错
4出错严重,没救了,等死吧
5出错严重,没救了,等死吧
  1. S 5 + S 4 + S 3 + S 2 + S 1 = 3 S_5 + S_4 + S_3 + S_2 + S_1 = 3 S5+S4+S3+S2+S1=3 时可假定为是1个数据位出错,此时可以进行纠错。将位号为 S 4 S 3 S 2 S 1 S_4 S_3 S_2 S_1 S4S3S2S1的数据位翻转即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值