海明码浅析
海明码
首先,海明码是一种基于偶校验的一种校验码,只适用于编码有一位出错的情况。
海明码的位数
对于原来的n位信息码,我们为其加上k位校验码,也就是一共n + k位
对于这n + k位码,每一位都有可能出错,因此对于每一种出错情况加起来一共n + k种状态,再加上全部正确的情况,因此一共n + k + 1中状态。
而k位校验码,因为是二进制,所以一共能表示种状态。
因此,我们校验码能表示的状态要大于等于可能出现的状态,即
另外第i位校验码要放在海明码的第位上
海明码个人理解
我们假设信息位为 1010,此时n = 4,可得k = 3
我们先确定校验位的分布:
1 | 0 | 1 | ? | 0 | ? | ? |
我们对于这7位海明码的信息位序号先进行二进制转换,即
而第 i 位校验码可以理解为掌管着信息码序号的第 (i - 1) 位二进制位上为 1 的那些信息码(这样有助于最后统一确认错误代码的位置,后面会解释)
那么第 1 位校验码也就掌管着 ,因为他们的第 0 位二进制位上为 1
同理可得,
第 2 位校验码掌管着
第 3 位校验码掌管着
那么,我们该如何确定每一位校验码上是 0 还是 1 呢?
最开始提过,海明码是一种基于偶校验的一种校验码,因此对于每一位校验码加上其掌管的那些信息位一共有偶数个 1 即可
举一个例子:
对于第一位校验码和其掌管的信息位 ,我们只需要让这四个数字有偶数个 1 即可,因为 信息位为 1010,所以此时不算 已经有 2 个 1 了,因此我们得到 为 0,我们可以用异或的方式来计算 ,即
依次计算,我们最后就可以得到我们所要的海明码了。
那么对于已知的一串海明码我们又该如何确定错误的那一位呢?
理解了上面的,这个就非常简单了,还是以第一位校验码举例子,我们只需要计算 的值是否为 0,如果为 0 则说明校验码和其掌管的信息位没有错,如果为 1 则说明错误的位置序号的二进制下第 0 位 有 1 的那些序号
那么最终就可以得到一个数字,这里借用王道视频的一张图
也就是第 2 个数字错了
在这里我们要体会一下上面的那个“有”字,我们可以用一张集合的图来表示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律