这是我学习过程中花好几个小时解决的问题,现在与大家分享一下
注意:鉴于本人水平有限,有些东西是个人的理解,可能不是那么很标准,请大侠们多少指教,
首先了解几个概念:
1.异或的运算方法是一个二进制运算:
1^1=0  0^0=0  1^0=1  0^1=1
两者相等为0,不等为1.
异或的作用:交换两个整数的值时可以不用第三个参数。
如a=11,b=9.以下是二进制
a=a^b=1011^1001=0010;
b=b^a=1001^0010=1011;
a=a^b=0010^1011=1001;
这样一来a=9,b=11了。
2.海明码是在原编码的基础上附加1部分代码,使其满足纠错码的条件,原编码可将它称为信息码,附加码称为校验码(又可称为监督码或冗余码)。编码效率最高。它属于线性分组码,由于线性码的编码和译码容易实现,至今仍是应用最广泛的1类码。
海明校验的特点不仅具有检测错误的能力,同时还具有给出错误所在准确位置的能力。
        好了现在我们开始看看怎么去求海明码和他是怎样去纠错的。
海明码编码可遵循以下四个步骤:
1。由信息位数,根据海明不等式,确定校验位数
2。确定校验码位置 
3。确定校验码的值
4。求出汉明码
我们现在具体看一下:
1.海明不等式2的r次方减一大于等于k+r(根据信息位数,确定校验位数,2^r-1≥k+r,其中,k为信息位数,r为校验位数。求出满足不等式的最小r,即为校验位数。)
2.确定校验码位置
从理论上讲校验码位可放在任何位置,但习惯上将它放于位置1,2,4,8……等位置。感觉记住这几个位置就行,
备注:(对于校验位少的可用强记法记住所在位置,而对于位数较多的强记法就不适用,在这里介绍1种公式法,不用死记硬背,即可求出各校验码的位置。
校验位rn对应的位置为2n,n的取值从0开始,则:
r0=20=1  r1=21=2  r2=22=4  r3=23=8
将校验位填在表格1对应的单元格内,其余位用信息码填充。表格1中,位数是指数据存放在第几位,共11位,用In表示(n的取值从1至11)。
11 10 9 8 7 6 5 4 3 2 1 位数
1 0 0 r3 1 1 0 r2 1 r1 r0 编码
)
3.确定校验码的值(成功与否的关键)
用我自己的话写 (带有局限性):海明码的位号拆分成校验码位号的2的N-1次幂的和 如图2.6 备注说明 然后校验码的值就等于所校验的所有位值的异或值。over 下面是从网上找的详细解答。
在海明码中, 位号数(1、2、3、……、n)为2的权值的那些位,即:
1(20)、2(21)、4(22)、8(23)、…2r-1位,作为奇偶校验位
并记作: P1、P2、P3 、P4、…Pr,余下各位则为有效信息位。
例如: N=11 K=7 r=4 相应海明码可示意为
位号   1  2   3   4   5   6   7   8   9   10   11
P占位 P1 P2 × P3 × × × P4   ×   ×   ×
其中×均为有效信息,海明码中的每一位分别被P1P2P3P4… Pr 中的一至若干位所校验,其规律是:
第i位由校验位位号之和等于i的那些校验位所校验
如:海明码的位号为3,它被P1P2(位号分别为1,2)所校验
海明码的位号为5,它被P1P3(位号分别为1,4)所校验
归并起来: 形成了4个小组,每个小组一个校验位,校验位的取值,仍采用奇偶校验方式确定。
如表 2·6 、表2·7所示: 
(自我认知:感觉就是码位的拆分,拆分成校验码的2的N—1次方幂的和)
其次,校验位rn由信息码对应位数的幂之和形式中包含有n的信息码异或而得,从表格2.6  2.7分析可知, p1的值由I11(信息码为1)、I9(信息码为0)、I7位(信息码为1)、I5位(信息码为0)、I3(信息码为1)对应的信息码异或而得,


4.求海明码。根据上面的校验码公式表表格填好后,写出海明码。
5.校验
若有17位长的信息码为1001101,由7位信息码,求出了汉明码为10011100101,若该编码传输被接收时,第7位变成了0,接收端如何来判断并且纠正错误呢?
在海明码中,通过校验因子进行验证,校验因子公式为Sn=rn(校验码) ○+ Rn(接收码)
rn(校验码)即为所对应的r的取值,Rn(接收码)为由信息码对应位数的幂之和形式中包含有n的信息码异或而得。
如表格4所示,出错的第7位数据用蓝色显示,×××表示校验位,黑色表示信息位。
S0=r0(校验码) ○+ R0(接收码)=1○+1○+0○+0○+0○+1=1
S1=r1(校验码) ○+ R1(接收码)=0○+1○+1○+0○+0○+1=1
S2=r2(校验码) ○+ R2(接收码)=0○+0○+1○+0=1
S3=r3(校验码) ○+ R3(接收码)=1○+0○+0○+1=0
求出来的S3S2S1S0=0111(即十进制7),该数指示了发生错误的比特的准确位置是第7位,1旦确定了错误的位置,接收方就可在将该位纠正过来
感觉就这么多东西了。
做几个题看看:
  求信息1011的海明码。
   解答:
  我们可以按照上面所说的编码步骤进行解题:
  (1)2r≥4+r+1,确定校验们为3位23≥4+3+1。
  (2)列出公式表格。
   表1-6校验位公式表
7654321位数
I4I3I2 I1  信息位
   r2 r1r0校验位
  7=22+21+20,6=22+21,5=22+20,3=21+20
  r2=I4+ I3+ I2
  r1= I4+ I3+ I1
  r0= I4+ I2+ I1
  (3)根据公式得r 2 =0,r1 =0,r0=1
  (4)加入表格。
   表1-7 对表1-6填充数据后的表格
7654321位数
101 1  信息位
   0 01校验位
  则海明码为1010101
例题2
  信息位8位的海明码,在接收到报文110010100000,判断传输是否出错,并求出发送端发送的信息位。
   解答:
  2r≥8+r+1,确定校验位为4位24≥4+4+1。
   表1-8校验位公式表
121110987654321位数
I8I7I6I5 III I  信息位
    r3   r2 r1r0校验位
  按照上面的海明码信息位和校验位的分布情况表,对接收数据进行分解:
   表1-9 对表1-8填充数据后的表格
121110987654321位数
1100 010 0  信息位
    1   0 00校验位
从而得到信息位为11000100,校验位为1000。
  因为12=23+22 ;11=23+21; 9=23+20;7=22+21+20; 6=22+21 ;5 =22+20;3=21+20 ;
  可得发送端校验位:
  r3= I8+ I7+ I6+ I5;
  r2= I8+ I4+ I3+ I2;
  r1= I7+ I6+ I4+ I3 + I1;
  r0= I7+ I5+ I4+ I2+ I1。
  接收端可根据以下关系验证是否出错
  S3= r3+ I8+ I7+ I6 + I5;
  S2= r2+ I8+ I4 + I3 + I2;
  S1= r1+ I7+ I6 + I4 + I3+ I1;
  S0= r0+ I7+ I5 + I4 + I2+ I1;
  注意:其中的rn为接收端校验位。
  由上面的算式得S3 S2 S1 S0=1001,从而得知第九位出错,所以信息位为11010100。此外,若S3 S2 S1 S0全为0,则证明传输正确。(试题来源于希赛)