海明码详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

海明码详解

这两天也在研究海明码的问题,把我的理解说给你吧,按照我说的可以顺利得到海明码

步骤:

一、确定校验码的位数k

二、确定校验码的位置

三、数据的位置

四、求出校验位的值

首先,海明码的作用是:在编码中如果有错误,可以表达出第几位出了错,二进制的数据只有0和1,修改起来很容易,求反即可,这需要加入几个校验位。

重要的知识点:

海明码的组成,不是简单的在后面加上校验位,海明码≠数据位+检验位

那检验位该怎么加呢?

它是根据总的位置来加的,加在【2的几次幂】的位置上,这个位置不是我们通常的从右向左数位置,刚好相反,

是从左右

如下图:P是校验位, D是数据位:原始的数据是:101101 校验位是插到了 1 2 4 8这几个位置上的。

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

步骤一、确定校验码的位数k

公式:m+k+1≤2^k (m是数据位的位数,K是要加的校验位的位数)

数据长是4位,校验码就是3位

4+k+1≤2^k

K最小只能是3

数据长是5,6,7,8,9,校验码就是4位

5+k+1≤2^k

K最小就只能取4

101101 数据位是6位,那校验位应该是4位,那总位数是:6+4=10位

步骤二、确定校验码的位置

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

(图1)

注意:【位置是从左----------右编码】(网上好多都反了,都是从右往左的,这应该是错的)

校验位就插在2的幂次方的位置上。4个检验位就是插到,2的0次方=1,2的1次方=2,2的2次方=4,2的3次方=8的位置上。始上(图1)

步骤三、数据的位置

数据位置就按顺序写入进去就OK了,不要写到校验位就是的了。

步骤四、求出校验位的值

也就是求图1中:p1 p2 p3 p4 的值。那这几个数该如何求值呢?这里就要引进一个线性码的概念了,就是这4位校验码和图1中的那些位置上的数有关系呢?

这里有一个进制转换的问题要先解决:

因为是4位校验码,所以我们可以s4 s3 s2 s1 这个数来表示这个4位校验码,也就是p4 p3 p2 p1

M1号位是十进制的1 转成四位二进制数就是:0001 即M1 和s1有关系

同样的道理

M2 变成四位二进制数: 0010 0010----s4 s3 s2 s1 s2的位置上是1 ,所以M2和S2有关系。

位置-----s4 s3 s2 s1

1======0 0 0 1

2======0 0 1 0

3======0 0 1 1 M3和s1 和 s2 有关系

4======0 1 0 0 M4和S3

5======0 1 0 1

6======0 1 1 0

7======0 1 1 1

8======1 0 0 0

9======1 0 0 1

10=====1 0 1 0

所以就有 s1->1,3,5,7,9

s2->2,3,6,7,10

s3->4,5,6,7

s4->8,9,10

S1 = M1 ⊕M3 ⊕M5 ⊕M7 ⊕M9

S2 = M2 ⊕M3 ⊕M6 ⊕M7 ⊕M10

S3 = M4 ⊕M5 ⊕M6 ⊕M7

S4 = M8 ⊕M9 ⊕M10

(图2)

接下来就是代入求值的过程了,不要说你不懂“⊕”这个符号哦!这是异或,

异或说白了就是不带进位的二进制加法:即:1⊕1=0 1⊕0=1 0⊕1=1 0⊕0=0

按照图1中的指示,把相应的值代入到图2 的公式里,可以得到如下内容

S1=M1⊕M3⊕M5⊕M7⊕M9 =P1⊕D1⊕D2⊕D4⊕D5

S2=M2⊕M3⊕M6⊕M7⊕M10 =P2⊕D1⊕D3⊕D4⊕D6

S3=M4⊕M5⊕M6⊕M7 =P3⊕D2⊕D3⊕D4

S4=M8⊕M9⊕M10 =P4⊕D5⊕D6

如果海明码没有错误信息,S1、S2、S3、S4都为0,等式右边的值也得为0,由于是异或,所以Pi(i=1,2,3…)的值跟后边的式子必须一样才能使整个式子的值为零,即:Pi=后边的式子的值,即:

P1 = D1 ⊕ D2 ⊕ D4 ⊕ D5

P2 = D1 ⊕ D3 ⊕ D4 ⊕ D6

P3 = D2 ⊕ D3 ⊕ D4

P4 = D5 ⊕ D6

懂了吗?是不是说的有点跨度?仔细想一下异或的含义,以S4= P4⊕D5⊕D6为例,S4=0,就是说P4⊕D5⊕D6=0,那么P4和(D5⊕D6)必须一样(即P4= D5⊕D6),那么异或的结果才能为零吧?!!不要以算术加减法来理解,要用逻辑数学的思维啦!!

那么可以算出Pi的值了吧?

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的值填写到图1中,看“丙”行,就可以得到haimming编码啦!哈哈!

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

丙0 0 1 0 0 1 1 1 0 1

五、海明码校验过程

现在我们得到了D=101101的正确海明码就是

0 0 1 0 0 1 1 1 0 1

那么出错的时候是怎么验证出来的呢?比如第5位错了,第5位现在的值是0,如果错了,它只能是1,二进制就这两种值即:我们得到了这样的一组编码,现在要找出错误的位置(假定你不知道哪里错了啊!!!)

M1 M2 M3 M4 M5 M6 M7 M8 M9 M10

0 0 1 0 1 1 1 1 0 1

图4

现在又要用到我刚才说的那个强大的公式了,请看图2,算了,为了你不至于来回拨弄鼠标滚轮,我还是把图2 粘贴过来吧

S1 = M1 ⊕M3 ⊕M5 ⊕M7 ⊕M9

S2 = M2 ⊕M3 ⊕M6 ⊕M7 ⊕M10

S3 = M4 ⊕M5 ⊕M6 ⊕M7

S4 = M8 ⊕M9 ⊕M10

把图4中的值,带入到图2 的公式里

S1=0⊕1⊕1⊕1⊕0 =1

S2=0⊕1⊕1⊕1⊕1 =0

S3=0⊕1⊕1⊕1 =1

S4=1⊕0⊕1 =0

按照S4S3S2S1排列得到的二进制数为:0101,对应的值十进制为5,哇塞!找到啦!!哈哈!!纠错吧!把1改为0!

相关文档
最新文档