海明码浅析

海明码

首先,海明码是一种基于偶校验的一种校验码,只适用于编码有一位出错的情况。

海明码的位数

对于原来的n位信息码D4D3D2D1,我们为其加上k位校验码,也就是一共n + k位

对于这n + k位码,每一位都有可能出错,因此对于每一种出错情况加起来一共n + k种状态,再加上全部正确的情况,因此一共n + k + 1中状态。

而k位校验码,因为是二进制,所以一共能表示2k种状态。

因此,我们校验码能表示的状态要大于等于可能出现的状态,即2kn+k+1

另外第i位校验码Pi要放在海明码的第2i1位上

海明码个人理解

我们假设信息位为 1010,此时n = 4,可得k = 3

我们先确定校验位的分布:

H7 H6 H5 H4 H3 H2 H1
D4 D3 D2 P3 D1 P2 P1
1 0 1 0

我们对于这7位海明码的信息位序号先进行二进制转换,即

H3:3011

H5:5101

H6:6110

H7:7111

而第 i 位校验码可以理解为掌管着信息码序号的第 (i - 1) 位二进制位上为 1 的那些信息码(这样有助于最后统一确认错误代码的位置,后面会解释)

那么第 1 位校验码也就掌管着 H3H5H7,因为他们的第 0 位二进制位上为 1

同理可得,

第 2 位校验码掌管着 H3H6H7

第 3 位校验码掌管着 H5H6H7

那么,我们该如何确定每一位校验码Pi上是 0 还是 1 呢?

最开始提过,海明码是一种基于偶校验的一种校验码,因此对于每一位校验码加上其掌管的那些信息位一共有偶数个 1 即可

举一个例子:

对于第一位校验码和其掌管的信息位 P1H3H5H7,我们只需要让这四个数字有偶数个 1 即可,因为 信息位为 1010,所以此时不算 P1 已经有 2 个 1 了,因此我们得到 P1 为 0,我们可以用异或的方式来计算 P1,即

P1=H3H5H7

依次计算,我们最后就可以得到我们所要的海明码了。

那么对于已知的一串海明码我们又该如何确定错误的那一位呢?

理解了上面的,这个就非常简单了,还是以第一位校验码举例子,我们只需要计算 P1H3H5H7的值是否为 0,如果为 0 则说明校验码P1和其掌管的信息位没有错,如果为 1 则说明错误的位置序号的二进制下第 0 位 1 的那些序号

那么最终就可以得到一个数字,这里借用王道视频的一张图

image-20220707180433627

也就是第 2 个数字错了

在这里我们要体会一下上面的那个“有”字,我们可以用一张集合的图来表示

image-20220707180601754

posted @   Yra  阅读(383)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示