海明码的纠错过程
来源:互联网 发布:战地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。
//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。
- 海明码的纠错过程
- 海明码纠错运算
- 海明码检验和纠错
- 简单的C语言海明码纠错程序,已调通
- 海明码计算及其纠错原理详解
- 计算机系统知识(一)—海明码纠错
- 你看得懂的海明码校验和纠错原理(一)
- 你看得懂的海明码校验和纠错原理(二)
- 你看得懂的海明码校验和纠错原理(一)
- 你看得懂的海明码校验和纠错原理(二)
- 你看得懂的海明码校验和纠错原理
- 你看得懂的海明码校验和纠错原理
- 史上最通俗的海明码编码计算、检错和纠错原理解析
- 你看得懂的海明码校验和纠错原理(一)
- 你看得懂的海明码校验和纠错原理
- 你看得懂的海明码校验和纠错原理
- 史上最通俗的海明码编码计算、检错和纠错原理解析
- 你看得懂的海明码校验和纠错原理
- 今天我又玩起了MUD
- 编程野路:多线编程之二,一个线程类
- 毕业后
- .NET操作注册表的方法
- 给前流氓一点胡萝卜
- 海明码的纠错过程
- 与你分享五年HR招聘与面试的体会
- VB站点
- 大彻大悟
- 大彻大悟
- 在没有数据时,如何使用FormView增加数据
- VB编程规范
- 在IIS下PHP的安装配置
- Data Grid Merge Cell