当前位置: 代码迷 >> 综合 >> 汉明码 / 海明码 / Hamming Code
  详细解决方案

汉明码 / 海明码 / Hamming Code

热度:18   发布时间:2023-12-18 14:05:38.0

1、异或

1 ? 1 = 0
0 ? 0 = 0
1 ? 0 = 1
0 ? 1 = 1

2、Hamming Code

参考博客1:https://www.cnblogs.com/godoforange/p/12003676.html
参考博客2:https://blog.csdn.net/Yonggie/article/details/83186280

“两位检错、一位纠错”

(1)检错原理:

汉明码默认一串数据只错一位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)计算:在几个位置,放校验码

公式: 2^k >= k + 数据位数 + 1

如:1100,数据位数为4
首先猜想:k>2,2^k >4
尝试:k=3,2^3 >= 3+4+1,成立
则k=3

如:10001,数据位数为5
首先猜想:k>2,2^k >5
尝试:k=3,2^3 >= 3+5+1,不成立
尝试:k=4,2^4 >= 4+5+1,成立
则k=4

(3)确定哪些位置放校验码

位置号为2^k次幂,被指定为 校验位
从右往左排:

在这里插入图片描述

(4)按照每个位置的二进制表示,进行分组
在这里插入图片描述
数据位数值,为原数值00111001,从左往右按顺序填入(word stored as)
以下分组,只看数据位的二进制表示

1、最后一位为1:xxx1
1011、1001、0111、0101、0011、0001
对应的数据位为:D7,D5,D4,D2,D1(0001对应的是校验位,故不纳入计算,其他分组直接忽略非数据位)
C1 = D7?D5?D4?D2?D1 = 0?1?1?0?1 = 1

2、倒数第二位为1:
1011、1010、0111、0110、0011
C2 = D7?D6?D4?D3?D1 = 0?1?1?0?1 = 1

3、第二位为1:
1100、0111、0110、0101
C2 = D8?D4?D3?D2 = 0?1?0?0 = 1

4、首位为1:
1100、1011、1010、1001
C2 = D8?D7?D6?D5 = 0?0?1?1 = 0

计算得到,海明码为:1110,填入上表的校验位

(5)检错、纠错

如果此时,有一个位置出错,则海明码会改变,通过对原海明码、新海明码取反、再异或,得到的结果,代表在第几个位置出错
如:
上例中的原海明码为1110,出错后的 海明码为1000
取反后:0001、0111
0001?0111=0110,即在第6个位置出错,对应数据位D3
(确实符合下表中的出错后数据——word fetched as)
在这里插入图片描述
纠错:对应的数据位,取反
如:这个出错后,D3为1,将其改为0即可

  相关解决方案