海明码(汉明码、Hamming Code)

目录

简介

海明码又称为汉明码,英文名Hamming Code。是差错控制中的纠错码。

编码

概述

海明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。
能侦测并更正一个比特的错误;若有两个比特出错,则只能侦测,不能更正;若有三个或更多的比特出错,则不能侦测,更不能更正。

示例

以二进制串10110为例,以偶校验将其编码为海明码。

第1步:校验位的位置

生成的海明码中,位置为2的幂位均为校验位,用表格表示如下:

海明码中的位置1234567891011121314151617
位置为2的幂2^02^12^22^32^4

第2步:数据位的位置

除去校验位,全部都是数据位。
在第1步的表格中,我们标出数据位:

海明码中的位置1234567891011121314151617
是否为2的幂2^02^1数据2^2数据数据数据2^3数据数据数据数据数据数据数据2^4数据

第3步:填入数据位

将例子中的数据(二进制串10110)填入海明码。同时,为了方便识别,我们将校验位标为R,数据位标为D,即R1、R2、R4、R8、R16……,为校验位;D3、D5、D6、D7、D9……,为数据位。
继续完善表格:

海明码中的位置1234567891011121314151617
是否为2的幂2^02^1数据2^2数据数据数据2^3数据数据数据数据数据数据数据2^4数据
所在位的标识R1R2D3R4D5D6D7R8D9D10D11D12D13D14D15R16D17
海明码的值10110

第4步:如何计算出校验位的值

通过偶校验算出海明码中校验位的值,下表显示了各校验位的值如何计算:

海明码中的位置1234567891011121314151617
所在位的标识R1R2D3R4D5D6D7R8D9D10D11D12D13D14D15R16D17
参与R1校验XXXXXXXXX
参与R2校验XXXXXXXX
参与R4校验XXXXXXXX
参与R8校验XXXXXXXX
参与R16校验XX

所在位置的规律如下:

位置为Rx的检验位,是从第x位开始(即从Rx开始),检验x位,跳过x位,再检验x位,再跳过x位,以此类推。

例如上表中,位置为R4的检验位:
是从第4位开始(即从R4开始);
检验4位(检验4、5、6、7共4位);
跳过4位(跳过8、9、10、11共4位);
检验4位(检验12、13、14、15共4位),以此类推。

第5步:计算出校验位的值

最后,根据第4步计算出校验位的值并填入,就能得到海明码了,计算过程如下:

海明码中的位置1234567891011121314151617
是否为2的幂2^02^1数据2^2数据数据数据2^3数据数据数据数据数据数据数据2^4数据
所在位的标识R1R2D3R4D5D6D7R8D9D10D11D12D13D14D15R16D17
海明码的值R1R21R4011R80R16
  • 偶校验(R1, 1, 0, 1, 0) → R1 = 0
  • 偶校验(R2, 1, 1, 1) → R2 = 1
  • 偶校验(R4, 0, 1, 1) → R4 = 0
  • 偶校验(R8, 0) → R8 = 0
  • R16 = 数据太短,当用到D17位置时,才需要R16

将计算结果填入表中:

海明码中的位置1234567891011121314151617
是否为2的幂2^02^1数据2^2数据数据数据2^3数据数据数据数据数据数据数据2^4数据
所在位的标识R1R2D3R4D5D6D7R8D9D10D11D12D13D14D15R16D17
所在位的值011001100

得到的海明码为“0110 0110 0”。

侦测和更正

概述

首先,按照编码的方式(奇或偶校验),依次检测校验位R1、R2、R4、R8……,然后,将出错的校验位的位置相加,比如发现R1、R8出现错误,则将1和8相加,得到9,即为位置D9的比特出错,最后,将该错误的比特取反就能更正错误。

示例

假设编码示例中生成的海明码“0110 0110 0”,在传输中出错,导致最后一位(标识D9)出错,所以我们现在接收到的海明码为“0110 0110 1”。

海明码中的位置1234567891011121314151617
所在位的标识R1R2D3R4D5D6D7R8D9D10D11D12D13D14D15R16D17
正确的海明码011001100
接收的海明码011001101

第1步:检测校验位

该海明码使用的校验方式是偶校验,所以我们检查校验位时,也要使用偶校验。

根据接收到的海明码,计算校验位的值:

  • 偶校验(R1, 1, 0, 1, 1) → R1 = 1,出错
  • 偶校验(R2, 1, 1, 1) → R2 = 1,正确
  • 偶校验(R4, 0, 1, 1) → R4 = 0,正确
  • 偶校验(R8, 1) → R8 = 1,出错

第2步:确定出错比特的位置

将出错的校验位的位置相加:

出错比特的位置 = R1的位置 + R8的位置 = 1 + 8 = 9

第3步:更正错误

将第9位取反,就能更正错误。

错误的海明码为“0110 0110 1”,更正第9位后为“0110 0110 0”。

  • 61
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值