海明码的纠错过程

来源:互联网 发布:战地4网络需求 编辑:程序博客网 时间:2024/06/02 07:25
以前学习海明码的时候,一顿死记硬背,到现在早就记不得了,最近由于研究的相关性,又重新看了一遍海明码,有了一些想法,总感觉相关的书籍还有文档写的太抽象,有的恨不得直接搞到编码理论上去,其实我主要需要明白的是海明码怎么纠的错,而不是为什么能纠错,看了一堆的公式,感觉还是没有程序清楚明白,下面是我写的海明码,编码(encode)和纠错(check)的相关程序。
//java program
1 int[] encode(int[] data){
2     int n = Math.floor(Math.log(data.length));//the length of hamming code
3    int[] res = new int[n];
4    for(int i = 0; i < n; i++){
5        for(int j = 0; j < data.length; j++){
6            if((1<<i) & (j + 1) != 0)
7                res[i] ^= data[j];
8        }
9    }
10    return res;
11 }
12 int[] check(int[] data, int[] hamming){
13    int pos = 0;
14    for(int i = 0; i < hamming.length; i++){
15        for(int j = 0; j < data.length; j++){
16            if((1<<i) & (j + 1) != 0)
17                hamming[i] ^= data[j];
18        }
19        if(hamming[i] != 0)
20            pos += 1<<i;
21    }
22    if(pos > 0)
23        data[pos - 1] = ~data[pos - 1];
24    return data;
25 }
海明码的纠错位数是1位,最多检测错位为2位,所需要记录海明码的位数floor(log(N)),N表示的是数据的位数,现在我参照程序来解释一下海明码是怎么纠的1位错,最多能检测2位错。

设数据位数为63位,依此存储在data数组中(data.length = 63),代码1,2行是计算所需要的海明码的位数,并声明存储海明码的数组。代码4-7行就是计算海明码的实际代码,可以看出海明码的计算是根据相应数据位的二进制数来计算的,例如对于7而言,它的二进制代码为000111,所以它对海明码的贡献就是影响了海明码第1,2,3位的值,那么假设在只有一个数据位p错的话,它所导致的校验不一致的海明码的位,就是它二进制代码所影响的海明码的位,反过来,只要我们找出所有校验不一致的海明码的位数(代码14-18行),那么也就知道了相应数据位的二进制的值(代码19-20行),也就知道是第几位出错,从而可以把相应的位取反(代码22,23行),达到纠错的效果。

那么为什么海明码最多能检测2位错呢,现在我们来看看海明码是如何检验出两位的错误的,假设第p1,p2(p1<>p2)位数据错误,可以知道,他们相应的二进制位所影响位必不完全相同,因为p1,p2是不同的数,所以必然导致海明码某个校验位不一致,也就检测出错误,但是我们并不能从所得到的不一致的位来推测出p1,p2的值,例如:第3位与第7位都错,那么最后导致不一致的校验位是第3位,根据程序显然得出的是第4位出错(实质上是x+y=z,由z求x,y的不定方程问题,解是不唯一的)。那么为什么海明码无法检测3位或3位以上的错误呢,这是因为3位或3位以上的错误有可能互相影响使得最后的校验值全部一致,例如:取第3,4,7位出错,就会导致这种情况。

实际上知道了上面的知识,也就无所谓海明码了,本质上就是二进制表示的问题,也不会记不住了吧。

附注:
程序没有实际运行过,可能会存在一些bug,不过并不影响思想的表达,还有就是本身水平有限,很多简单的问题我的认识的很不清楚,盼望不要被牛人bs。
原创粉丝点击