zoukankan      html  css  js  c++  java
  • 【转载】海明码求解公式规律(转载自计算机网络高分笔记)

    海明码求解的具体步骤:

    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位。

     

  • 相关阅读:
    CPU 后缀
    获取当前IP的接口
    win10 禁用自动更新
    C# 调用腾讯云接口获取视频基本信息
    SQL Server服务器角色和数据库角色描述
    C# 使用cmd
    C# 对DataTable的简单操作
    参考文档链接地址-个人比较推荐的
    类似input框内最右边添加图标,有清空功能
    CentOS-6.3安装Mysql-5.5.29[转]
  • 原文地址:https://www.cnblogs.com/landiljy/p/5342725.html
Copyright © 2011-2022 走看看