海明码--学了一个下午,这个例子对我理解这个问题关系很大
                                      
海明码用k位冗余位来校正m+k位数据。由于k位冗余位可以表示2k次方个数,其中要有一个数表示m位数据都没错,剩下的2k次方减1个数表示有错的信息,且必须能表示错误位在m个不同位置时的情况,所以必须要有2k次方减1>=m
 
效验位是跟数据位混在一起的,一般来说是放在2i次方处(i=0,1,2...)比如假设原始数据为8D1D2D3D4D5D6D7D8,通过上面的不等式可以知道k=4,也就是效验位为P1P2P3P4,则最终发送出去的数据为:
码位:m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12
码字:P1 P2 D1 P3 D2 D3 D4 P4 D5 D6 D7 D8
 
海明码的监督关系:
这个比较难点。
1个效验位可以效验:m1 m3 m5 m7 m9 m11 1 1+2 1+4 1+2+4 1+8 1+2+8 1+2+4+8...
2个效验位可以效验:m2 m3 m6 m7 m10 m11 2 2+1 2+4 2+1+4 2+8 2+1+8 2+1+4+8...
3个效验位可以效验:m4 m5 m6 m7 m12 4 4+1 4+2 4+1+2 4+8 4+1+8 4+1+2+8...
4个效验位可以效验:m8 m9 m10 m11 m12 8 8+1 8+2 8+1+2 8+4 8+1+4 8+1+2+4...
呼,应该不难看出规律吧。
 
效验位的计算:
用例子说话最容易理解。假设信息为8位:1 1 0 0 1 1 0 0 ,则编码后为:
码位:m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12
码字:P1 P2 1 P3 1 0 0 P4 1 1 0 0
监督关系为(用S表示,+表示逻辑加):
S1=m1 + m3 + m5 + m7+ m9+ m11
S2=m2 + m3 + m6 + m7+ m10+ m11
S3=m4 + m5 + m6 + m7+ m12
S4=m8 + m9 + m10 + m11+ m12
当信息没有错误时,S1=S2=S3=S4=0,代入数据,有
0=P1 + 1 + 1 + 0 + 1 + 0
0=P2 + 1+ 0+ 0+ 1+ 0
0=P3 + 1+ 0+ 0+ 0
0=P4 + 1+ 1+ 0+ 0
很容易计算出:P1=1P2=0P3=1P4=0
所以海明码为:"1 0 1 1 1 0 0 0 1 1 0 0"
   海明码是一位纠错码,即如果数据在传输过程中有一位出错,则可以知道出错的位数并通过取反将其改正过来。
 
    海明码的基本意思是给传输的数据增加r个校验位,从而增加两个合法消息(合法码字)的不同位的个数(海明距离)。假设要传得信息有m位,则经海明编码的码字就有n=m+r位。怎样安排才能达到我们的目的呢?在解释之前我们先看一道微软的面试题。