海明码

这几天在研究海明码,发现这玩意挺厉害的。但是无论网上还是书中,没用的东西写了一大堆,就是搞不明白。最多就知道校验位和数据位的大概排列顺序,所以写一篇博客记录一下(可能也有写的不错的,我没有找到,我打算写个简单一点的)。

海明码介绍

海明码不仅可以校验,还可以纠错,只能错1位,错再多就检测都检测不出来了。
海明码是海明发明的,在牛X哄哄的实验室–贝尔实验室里面发明的,故事自行百度。

海明码计算

以下均为偶校验,坚决不用8位数字来充当数据位,争取提供具有广泛性的方法

海明码校验位与数据位的关系

2^k -1 >= m+k
k:校验位 m:数据位
需要计算时,可以用这个公式计算下需要几个校验位,其他时候直接排列校验位和数据位就可以。
排列方式:

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 k2 k3 k4
m1 m2 m3 m4 m5 m6 m7 m8 m9

规律就可以看出来了:
第1个和第2个都是校验位;第2个校验位后跟随2^1-1个数据位,然后是第3个校验位;第3个校验位后跟随2^2-1个数据位,然后是第4个校验位;…… 依此类推

计算方法

设 数据位 101011001
所以 数据位+校验位就是 ??1?010?11001

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 k2 k3 k4
1 0 1 0 1 1 0 0 1

k1的求法:1 3 5 7 9 11 13是不是偶数个1?如果是,k1就是0,否则就是1。
从第1(2^0)位开始,就是隔1(2^0)位计算1(2^0)位
k2的求法:2 3 6 7 10 11 14是不是偶数个1?如果是,k2就是0,否则就是1。
从第2(2^1)位开始,就是隔2(2^1)位计算2(2^1)位
…… 依此类推

1 2 3 4 5 6 7 8 9 10 11 12 13
k1 1 0 1 0 1 1 0 0 1
1 k2 1 0 1 0 1 1 0 0 1
1 1 1 k3 0 1 0 1 1 0 0 1
1 1 1 0 0 1 0 k4 1 1 0 0 1

所以,最后的海明码就是:1110010111001

海明码纠错

接下来就是纠错:
假设第一次,错在第4位(校验位)了。1111010111001
假设第二次,错在第5位(数据位)了。1110110111001
判断是否正确依然采用偶校验,就是说如果有偶数个1,那么就是正确;如果是奇数个1,就是错误。
第一次纠错:

检测 1 2 3 4 5 6 7 8 9 10 11 12 13 校验
k1 1 1 1 1 0 1 0 1 1 1 0 0 1 正确
k2 1 1 1 1 0 1 0 1 1 1 0 0 1 正确
k3 1 1 1 1 0 1 0 1 1 1 0 0 1 错误
k4 1 1 1 1 0 1 0 1 1 1 0 0 1 正确

只有k3组出现错误,所以是k3组的校验码错误,是第4位。
第二次纠错:

检测 1 2 3 4 5 6 7 8 9 10 11 12 13 校验
k1 1 1 1 0 1 1 0 1 1 1 0 0 1 错误
k2 1 1 1 0 1 1 0 1 1 1 0 0 1 正确
k3 1 1 1 0 1 1 0 1 1 1 0 0 1 错误
k4 1 1 1 0 1 1 0 1 1 1 0 0 1 正确

k1和k3两组出现错误,所以是k1和k3俩组的共同校验的数据位出现错误,可以看到是第5位,为什么不是第11位,因为11位是k1,k3,k4三组共同校验的,如果是k1,k3,k4都出现错误,那么就是11位。
总结:
1.如果仅有1组出现错误,那么就是这1组的校验位出现错误。
2.如果多组出现错误,那么就是这几组共同校验的那位出现错误。

海明码原理

研究海明码为什么可以做到以上的内容。
大概明白,但是还有点其他事情要做,而且还要再思考思考。
留坑占用,以后会更新吧?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章