海明码

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

海明码介绍

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

海明码计算

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

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

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

12345678910111213
k1k2k3k4
m1m2m3m4m5m6m7m8m9

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

计算方法

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

12345678910111213
k1k2k3k4
101011001

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)位
…… 依此类推

12345678910111213
k1101011001
1k2101011001
111k301011001
1110010k411001

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

海明码纠错

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

检测12345678910111213校验
k11111010111001正确
k21111010111001正确
k31111010111001错误
k41111010111001正确

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

检测12345678910111213校验
k11110110111001错误
k21110110111001正确
k31110110111001错误
k41110110111001正确

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

海明码原理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值