【转载】海明码求解公式规律(转载自计算机网络高分笔记)

海明码求解的具体步骤:

1.确定校验码的位数r

2.确定校验码的位置

3.确定数据的位置

4.求出校验码的值

假设要推到D=101101这串二进制数的海明码,应按照以下步骤。

1.确定校验码的位数r。

      数据的位数k=6,按照公式来计算满足条件r的最小值,如下:

         2r-1≥k+r

         2r≥7+r

解此不等式,满足不等式的最小r为4,也就是D=101101的海明码应该有6+4=10位,其中原数据6位,效验码4位。

2.确定校验码的位置。

      不妨假设这4位效验码分别为P1、P2、P3、P4;数据从左到右为D1、D2、……、D6.编码后的数据共有6+4=10位,设为M1、M2、……、M10.

校验码Pi(i取1,2,3,4)在编码中的位置为2i-1,见表3-1.

                                   表3-1  校验码Pi在编码中的位置                                                           

  M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
P1 P2   P3       P4    

3.确定数据的位置。

       除了效验码的位置,其余的就是数据的位置,填充进去即可,于是可以把数据信息先填进去,见表3-2的“乙”行。

                                                                       表3-2 数据在编码中的位置

  M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
    1   0 1 1   0 1

4.求出校验码的值。(精华)

      这个公式有规律可循,但基本没有任何教材讲过,无意在一篇论文中看到。

      假设出错位为e1、e2、e3、e4,现在需要做的就是将M1、M2、……、M10和e1、e2、e3、e4的关系对应出来,只要这个关系出来了,所有问题就都解决了。演示几个。

M1下标中的1可以表示成0001,这里的0001分别对应e4、e3、e2、e1(倒过来看),由于e1的值为1,因此M1只和e1有关;M3下标中的3可以表示成0011,因此M3和e1

、e2有关;M7下标中的7可以表示成0111,因此M7和e1、e2、e3有关。其他以此类推,只需将这些有关的用异或符号“⊕”连接起来即可,最后可得以下公式:

                         e1=M1⊕M3⊕M5⊕M7⊕M9

                         e2=M2⊕M3⊕M6⊕M7⊕M10

                         e3=M4⊕M5⊕M6⊕M7

                         e4=M8⊕M9⊕M10

然后将表3-1中求出的数据对应过来,即

                         e1=P1⊕D1⊕D2⊕D4⊕D5

                         e2=P2⊕D1⊕D3⊕D4⊕D6

                         e3=P3⊕D2⊕D3⊕D4

                         e4=P4⊕D5⊕D6

如果海明码没有错误信息,e1、e2、e3、e4都为0,等式右边的值也得为0,由于是异或,因此Pi(i取1,2,3,4)的值跟后边的式子必须一样才能使整个式子的值为0,即

                        P1=D1⊕D2⊕D4⊕D5

                        P2=D1⊕D3⊕D4⊕D6

                        p3=D2⊕D3⊕D4

                        P4=D5⊕D6

下面只需要将值代入计算即可: 

                        P1=D1⊕D2⊕D4⊕D5=1⊕0⊕1⊕0=0

                        P2=D1⊕D3⊕D4⊕D6=1⊕1⊕1⊕1=0

                        p3=D2⊕D3⊕D4=0⊕1⊕1=0

                        P4=D5⊕D6=0⊕1=1

接下来把Pi的值填写到表3-1中,见表3-3的“丙”行,就可以得到海明码。

                                                                      表3-3 “丙”行中的数据

  M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
0 0 1 0 0 1 1 1 0 1

 故101101的海明码为0010011101.

但是知道了怎么编写海明码,还需要知道怎么校验,方法如下。

现在假设第5位出错了,也就是第5位在传输的过程中被改为“1”,即得到的数据为0010111101.现在要找出错误的位置(假设现在不知道出错的位置)。

继续使用:

                         e1=M1⊕M3⊕M5⊕M7⊕M9=0⊕1⊕1⊕1⊕0=1

                         e2=M2⊕M3⊕M6⊕M7⊕M9=0⊕1⊕1⊕1⊕1=0

                         e3=M4⊕M5⊕M6⊕M7=0⊕1⊕1⊕1=1

                         e4=M8⊕M9⊕M10=1⊕0⊕1=0

按照e4、e3、e2、e1的排序方式得到的二进制序列为0101,恰好对应十进制5,这样就找到了出错的位置,即出错位是第5位。

 

原文地址:https://www.cnblogs.com/landiljy/p/5342725.html