汉明码

     汉明码最大的作用,纠错,它对不同位数的编码n会插入相应位数的纠错位k。n和k满足的关系是2^k-1>=n+k,为什么是这样一个关系呢?对于一个长度为n的编码,它可能出现错误的位数为n,当插入纠错位k时,它可能出现错误的位数为n+k,此时的汉明码要起到纠错的作用,就要求其能表示的错误位数肯定要高于可能出现错误的位数,而它能表示的错误位数为2^k(k位二进制),显然我们可以得到上述关系。

    得到应该插入的纠错位为k之后,我们需要知道的是,这k位纠错位插入的位置应该是哪里。为了保证能够检验到每一位,我们选择2^m(m=0,1.....k-1)这些位作为检验位,大家可以发现这些位的共同性,其编码都是只有一位为1,其余位为0,如1,10,100......插入这些纠错位之后,我们还要对这些纠错位进行赋值,这个赋值是建立在正确的编码进行异或之上的。

    对于第一位,即1位,应由0位为1的所有位进行异或得到,即1,3,5,7,9,11,13……

    对于第二位,即2位,应由2位为1的所有位进行异或得到,即2,3,6,7,10,11……

    对于第三位,即4位,应由4位为1的所有位进行异或得到,即4,5,6,7,12,13,14,15……

    以此类推

    对于异或操作,相同得0,相反得1,可以这样记,一男一女才能有宝宝不是……(虽说是……但是确实是很好的记住了异或,之前总是会忘记异或的概念)

    而对于汉明码的纠错能力,对于一个编码,我们对每一位纠错位的位数写成二进制后,对应位为1的所有位,进行异或,例如,对于纠错位1位,其二进制为1,选择所有位转化为二进制后,0位为1的位进行异或。

    给定一个实例来实现汉明码,给定编码为11000010

123456789101112
  1 100 000

0

可以看到1,2,4,8位为纠错位

1位纠错位由3,5,7,9,11异或得到,为0

2位纠错位由3,6,7,10,11异或得到,为1

4位纠错位由5,6,7,12异或得到,为1

8位纠错位由9,10,11,12异或得到,为0

123456789101112
011110000000

可以看到我们已经实现了汉明码011110000000

可以试试此编码的纠错能力

给定一个编码为011110000001

123456789101112
011110000001

我们对第一位纠错位二进制1,即0位为1的所有位进行异或得到0

第二位纠错位二进制10,即1位为1的所有位进行异或得到0

第三位纠错位二进制100,即2位为1的所有位进行异或得到1

第四位纠错位二进制1000,即3位为1的所有位进行异或得到1

从后往前得到二进制1100,此二进制为十进制数中的12,可知是第12位出现了错误。

来自一个代码小白,如有不对,敬请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值