汉明码(Hamming Code)原理及实现

汉明码实现原理

汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码。汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误。(要注意的是,汉明码只能发现和修正一位错误,对于两位或者两位以上的错误无法正确和发现)。

设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:

2 k − 1 ≥ n + k 2^k-1\geq n+k2k−1≥n+k

这就是Hamming不等式,汉明吗规定,我们所得到的m位编码2 k ( k ≥ 0 ∣ 2 k &lt; n + k ) 2^k(k\geq0\mid 2^k&lt;n+k)2k(k≥0∣2k<n+k)位上插入特殊的校验码,其余位把源码按顺序放置。

汉明码的编码规则如下:

  • 在新的编码的2^(k-1)(k >= 0)位上填入0(即校验位)
  • 把新的编码的其余位把源码按原顺序填入
  • 校验位的编码方式为:第k位校验码从则从新的编码的第2^(k - 1)位开始,每计算2^(k - 1)位的异或,跳2^(k - 1)位,再计算下一组2^(k - 1)位的异或,填入2^(k - 1)位,比如:
    第1位校验码位于新的编码的第1位(2 ^(1-1) == 1)(汉明码从1位开始),计算1,3,5,7,9,11,13,15,…位的异或,填入新的编码的第1位。
    第2位校验码位于新的编码的第2位(2 ^(2-1) == 2),计算2,3,6,7,10,11,14,15,…位的异或,填入新的编码的第2位。
    第3位校验码位于新的编码的第4位(2 ^(3-1) == 4),计算4,5,6,7,12,13,14,15,20,21,22,23,…位的异或,填入新的编码的第4位。
    第4位校验码位于新的编码的第8位(2 ^(4-1) == 8),计算8-15,24-31,40-47,…位的异或,填入新的编码的第8位。
    第5位校验码位于新的编码的第16位(2 ^(5-1) == 16),计算16-31,48-63,80-95,…位的异或,填入新的编码的第16位。

汉明码编码实例

以10101编码为例,创建一个汉明码编码的空间,并且把源码填入编码的对应位中中,_ _ 1 _ 0 10 _ 1,并留出校验码位(校验位先设为0)。(因为2^4 - 1>= 5+4 && 2^3 - 1 < 5+ 3所以需要4位校验码)

  • 计算校验码的第1位(1,3,5,7,9进行异或): 结果为0,所以汉明码第2^0位为0,结果为0 _ 1 _ 0 10 _ 1
  • 计算校验码的第2位(2,3,6,7进行异或): 结果为0,所以汉明码第2^1位为0,结果为001 _ 0 10 _ 1
  • 计算校验码的第3位(4,5,6,7进行异或): 结果为1,所以汉明码第2^2位为0,结果为0011 0 10 _ 1
  • 计算校验码的第4位(8, 9进行异或): 结果为0,所以汉明码第2^3位为1,结果为0011 0101 1
  • 所以最终编码为001101011.

汉明码校验错误实例

我们以上面的编码为例,假设我们现在收到的编码为001101001,我们可以发现汉明码的第8位与原来的汉明码001101011不同,那我们怎么找出这个第8位的错误编码呢?

算法很简单,我们只要在算汉明码校验位的算法的上再算一遍,就得到了汉明码的校验方法,比如计算001101001对应的2^k位。

1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到0
4,5,6,7进行异或,得到0
8,9进行异或,得到1

我们把上述结果反着排列,得到1000,即十进制的8,根据汉明码的校验规则,编码出错的地方即在第8位,我们把第8位的0换成1,即可得原来的编码001101011。

上述的例子是出现在2k的校验位上的,如果出现在非2k位上,得到的结果也是一样的,比如:
假设收到的编码为001100011,即第6位出了错误,我们根据规则

1,3,5,7,9进行异或,得到0
2,3,6,7进行异或,得到1
4,5,6,7进行异或,得到1
8,9进行异或,得到0

我们把上述结果反着排列,得到0110,即十进制的6,根据汉明码的校验规则,编码出错的地方即在第6位,我们把第6位的0换成1,即可得原来的编码001101011。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值