计算及校验海明码的3个举例
作者:@caseyfu
本文为作者原创,转载请注明出处:https://www.cnblogs.com/caseor/p/calculate-hamming-code.html
目录
例1,计算1011的海明码及检验
例2,计算0111 011的海明码及检验
例3,计算0111 0110 11的海明码及检验
海明码具有检错纠错能力,用于传输质量较好的信道,因为出错太多检测不出来。
m位数据需要满足具有r位校验码
m+r ≤ 2r-1
校验位放在2n位置上,如??1? 111? 1111 111? 111...
校验码依次在20、 21、 22、 23、 24位置上,有的是从后往前写的,结果不影响,知道怎么算就行。
例1,计算1011的海明码及检验
1. 算校验位
原数据1011, 有4位数据位, 需满足4+r≤2r-1这个公式, 求得r=3,表明有3个检验位,以下用a、b、c、...来代替
得到ab1c011
2. 算校验位值
令发送方和接受方都采用偶检验的方法,也就是保证1的个数为偶数。采用奇检验结果也一样,但收发双方一定要用相同的检验方法。
a b 1 c 0 1 1
第一位检验位a的计算方法:从a开始检验一位,跳过一位,即20位,利用偶检验确定a。
第二位检验位b的计算方法:从b开始检验两位,跳过两位,即21位,利用偶检验确定b。
第三位检验位c的计算方法:从c开始检验四位,跳过四位,即22位,利用偶检验确定c。
a b 1 c 0 1 1
a 1 0 1 偶检验确定a=0
a b 1 c 0 1 1
b 1 1 1 偶检验确定b=1
a b 1 c 0 1 1
后面没有了,所以就是c 0 1 偶检验确定c=0
代入abc得海明码0110 011
3. 检验
传输海明码,若在信道上受到干扰,导致一位编码出现异常由0110 011→0111 011
根据确定检验位的值来检验,第n组 检验2n位,跳过2n位,分别把每组的数据异或,得出错位置。这里的异或也就是相当于偶检验的过程,1的个数为偶数G就为0。
0 1 1 1 0 1 1
G1=0⊕1⊕0⊕1=0
0 1 1 1 0 1 1
G2=1⊕1⊕1⊕1=0
0 1 1 1 0 1 1
G3=1⊕0⊕1⊕1=1
由于发送端采用的是偶检验那么G3G2G1=000可说明传送中没有出错,G3G2G1=100转化为十进制说明海明码第4位出错,将第四位纠错后变成0110 011
例2,计算0111 011的海明码及检验
1. 算校验位
m=7,根据m+r ≤ 2r-1求得r=4
a b 0 c 1 1 1 d 0 1 1
2. 算校验位值
令发送方和接受方都采用偶检验的方法,也就是保证1的个数为偶数。
a b 0 c 1 1 1 d 0 1 1
a b 0 c 1 1 1 d 0 1 1
a 0 1 1 0 1 偶检验确定a=1
a b 0 c 1 1 1 d 0 1 1
b 0 1 1 1 1 偶检验确定b=0
a b 0 c 1 1 1 d 0 1 1
c 1 1 1 偶检验确定c=1
a b 0 c 1 1 1 d 0 1 1
d 0 1 1 偶检验确定d=0
代入abcd得海明码1001 1110 011
3. 检验
传输海明码,若在信道上受到干扰,导致一位编码出现异常由1001 1110 011→1001 1110 111
根据确定检验位的值来检验,第n组 检验2n位,跳过2n位,分别把每组的数据异或,得出错位置。
1 0 0 1 1 1 1 0 1 1 1
G1=1⊕0⊕1⊕1⊕1⊕1=1
1 0 0 1 1 1 1 0 1 1 1
G2=0⊕0⊕1⊕1⊕1⊕1=0
1 0 0 1 1 1 1 0 1 1 1
G3=1⊕1⊕1⊕1=0
1 0 0 1 1 1 1 0 1 1 1
G4=0⊕1⊕1⊕1=1
由于发送端采用的是偶检验那么G4G3G2G1=0000可说明传送中没有出错,G4G3G2G1=1001转化为十进制说明海明码第9位出错,将第9位纠错后变成1001 1110 011
例3,计算0111 0110 11的海明码及检验
再来个多的,再多就没有意义了。
1. 算校验位
m=10,根据m+r ≤ 2r-1求得r=4
a b 0 c 1 1 1 d 0 1 1 0 1 1
2. 算校验位值
令发送方和接受方都采用偶检验的方法,也就是保证1的个数为偶数。
a b 0 c 1 1 1 d 0 1 1 0 1 1
a b 0 c 1 1 1 d 0 1 1 0 1 1
a 0 1 1 0 1 1偶检验确定a=0
a b 0 c 1 1 1 d 0 1 1 0 1 1
b 0 1 1 1 1 1偶检验确定b=1
a b 0 c 1 1 1 d 0 1 1 0 1 1
c 1 1 1 1 1偶检验确定c=1
a b 0 c 1 1 1 d 0 1 1 0 1 1
d 0 1 1 0 1 1偶检验确定d=0
代入abcd得海明码0101 1110 0110 11
3. 检验
传输海明码,若在信道上受到干扰,导致一位编码出现异常由0101 1110 0110 11→0001 1110 0110 11
根据确定检验位的值来检验,第n组 检验2n位,跳过2n位,分别把每组的数据异或,得出错位置。
0001 1110 0110 11
G1=0⊕0⊕1⊕1⊕0⊕1⊕1=0
0001 1110 0110 11
G2=0⊕0⊕1⊕1⊕1⊕1⊕1=1
0001 1110 0110 11
G3=1⊕1⊕1⊕1⊕0⊕1⊕1=0
0001 1110 0110 11
G4=0⊕0⊕1⊕1⊕0⊕1⊕1=0
由于发送端采用的是偶检验那么G4G3G2G1=0000可说明传送中没有出错,G4G3G2G1=0010转化为十进制说明海明码第2位出错,将第2位纠错后变成0101 1110 0110 11
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了