【海明码】(容易看懂)

转载自:http://www.cnblogs.com/scrutable/p/6052127.htmlhtml

海明码(也叫汉明码)具备一位纠错能力。本文以1010110这个二进制数为例解释海明码的编码和校验方法。网络

  编码学习

  肯定校验码的位数x编码

  设数据有n位,校验码有x位。则校验码一共有2x种取值方式。其中须要一种取值方式表示数据正确,剩下2x-1种取值方式表示有一位数据出错。由于编码后的二进制串有n+x位,所以x应该知足spa

2x-1 ≥ n+x   htm

  使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。blog

  肯定校验码的位置游戏

  校验码在二进制串中的位置为2的整数幂。剩下的位置为数据。如图所示。get

位置 1 2 3 4 5 6 7 8 9 10 11
内容 x1 x2 1 x3 0 1 0 x4 1 1 0

 

  求出校验位的值table

  以求x2的值为例。为了直观,将表格中的位置用二进制表示。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
内容 x1 x2 1 x3 0 1 0 x4 1 1 0

  为了求出x2,要使全部位置的第二位是1的数据(即形如**1*的位置的数据)的异或值为0。即x2^1^1^0^1^0 = 0。所以x2 = 1。

  同理可得x1 = 0, x3 = 1, x4 = 0。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
内容 0 1 1 1 0 1 0 0 1 1 0

 

  所以1010110的海明码为01110100110。

  校验

  假设位置为1011的数据由0变成了1,校验过程为:

  将全部位置形如***1, **1*, *1**, 1***的数据分别异或。

  ***1: 0^1^0^0^1^1 = 1

  **1*: 1^1^1^0^1^1 = 1

  *1**: 1^0^1^0 = 0 

  1***: 0^1^1^1 = 1

  以上四组中,若是一组异或值为1,说明该组中有数据出错了。***1 **1* 1***的异或都为1,说明出错数据的位置为1011。

海明码简单分析

 

肯定校验位个数

 

海明码的码组长度须要符合:2^r – 1 (r表明校验位个数)

为何是这个公式呢?由于:只有这样才能保证校验位足够覆盖整个须要校验的码组。

好比说:校验位有3位,那就是2^3 = 8 – 1 = 7 这样就能够校验长度为7的码组,若是按实际来讲,也就是信息位 4 位,校验码 3 位。

经过上面分析,咱们知道校验位 r 加上信息位 k 就等于 2^r – 1 , 这也就是为何书上有 k + r <= 2^r – 1 的缘由,下面是一些 R 和 K的关系表

信息码位数 1 2~4 5~11 12~26 27~57 58~120
校验码位数 2 3 4 5 6 7

注:表中数据取自网络

肯定校验位的位置

知道了须要多少位校验码,还须要知道把校验码放在哪一个位置上才行,这个只要记住,信息位在非2n的位置上,而校验位是在2n的位置上就能够了,条件再严格点就是,书上说的信息位所在海明码中的下标是须要等于前面几个校验组的下标,看到这里不懂没有关系,下面进行简单的例题分析。

举个粟(例)子:

信息字码组 : 1101 , 这时候信息位 k = 4 , 根据 k + r <= 2^r – 1 ,得出 r = 3 , 那就按书上说的,用P一、P二、P3来表示这3位校验码,这时候咱们就来作填字格游戏。

P1 P2 1 P3 1 0 1

位置就这么简单的肯定下来了,若是位数更多的话也是同样的,校验位就是在 一、二、四、八、16…….这些位置上。

计算校验位 Pi

上面已经知道要在什么位置插入校验码,如今就差下锅的料了,怎么求校验位实际的值呢?很简单!

根据海明码定义,是经过将信息进行分组,才得以实现检错和纠错的能力,就像一开始的图,每个Pi都会包含3个信息位。

问题来了,那我怎么知道这些信息位是哪几个?仍是书上的定义……

重点

好比说信息 1 1 0 1 ,从上面填字格游戏咱们能够看出,被分别安排在 H3,H5,H6,H7的位置(这些位置怎么来的?7位数从1到7给每位编号嘛!)

则:H3 = H1+H2 (这里是等式右边下标相加等于等式左边下标的意思,下面同样)

H5 = H1+H4

H6 = H2 + H4

H7 = H1 + H2 + H4

经过上面的关系式,咱们能够看出,右边在海明码中的数位,正好都是校验码的位置,下面来正式求校验码了。

P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)

P2(H2) = H3 ⊕ H6 ⊕ H7

P3(H4) = H5 ⊕ H6 ⊕ H7

大功告成!啥?还要我算出来?打字很累的,手短打字又慢,行吧行吧,想在之前本身学海明码,怎么看都不会的份上,可能也是本身太笨…….

信息码:1101 对应海明位 H三、H五、H六、H7,不要把海明码,校验位,信息位搞混了哦!虽然我也是常常弄混哈哈!

P1 = 1 ⊕ 1 ⊕ 1 = 1;

P2 = 1 ⊕ 0 ⊕ 1 = 0;

P3 = 1 ⊕ 0 ⊕ 1 = 0;

啥?异或不懂?不要紧,我也常常不懂,相同 = 0 ,不一样 = 1,异表示不一样,按或的规则,是否是好奇葩!

好了,如今咱们能够完成填字游戏了 P1 P2 1 P3 1 0 1 ==> 1010101,这就是咱们最后须要获得的海明码,终于完成了!

还没完呢……有了这个海明码还须要知道怎么校验有没有出错啊,简单简单,跟我继续来学习!

海明码纠错和检错

有了上面的校验码和信息码,咱们就能借用他们去知道怎么检查,信息在传送的过程当中有没有发生错误,废话很少说,下面开始,仍是书上的定义,由于校验码有三位,咱们这里再申明三位码分别用S一、S二、S3表示,知足下列关系:

S1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;

S2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;

S3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;

这样求出来的S一、S二、S3若是都为0就是没有出错,若是不是0就表示在海明码中出错的位置,将其取反就能够起到纠错的功能了。很简单吧,等等,为何是上面的关系式?哪来的?能够往上看看求校验码那里,这就是分组的结果,这里我就偷懒下不算了,大家能够本身算算,真的结束了……

相关文章
相关标签/搜索