第一次接触:海明校验码很难!后端
第二次接触:海明校验码仍是很难!spa
第三次接触:海明校验码很难? Say no.net
第四次接触:海明校验码除了步骤多一点,其实并不难 对象
海明校验码定义blog
海明码(Hamming Code)是利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的肯定位置插入k个校验位,经过扩大码距来实现检错和纠错。对于数据位m的数据,加入k位的校验码,它应知足:m+k+1<2^kci
揭开海明校验码神秘面纱get
因运算步骤较多,采用栗子的方式一步一步求解,更易于理解。博客
栗子1:table
求信息1011的海明码方法
第一步:求校验码的位数值K
根据公式 2^k >= m+k +1 ,信息1011的长度m=4, 2^k >= k+5 , -->k=3 ;
第二步:求校验码的位置 海明校验码方法中,校验码的位置是固定的,从2^0位,2^1 位 --> 2^2位 ... 2^n位 ,总个数为K位
校验码的位置在第1位、第2位、第4位,分别用R一、R二、R3表示;
第三步:画图表
注释: 我分别把七个位置用1~7来表示了 在填写信息为的时候也要把高位的数据填到高的位置 ,例如1011 就要相似图中的填法
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息码 | 1 | 1 | 0 | 1 | |||
校验码 | R1 | R2 | R3 |
第四步:计算校验位的值,也是最为关键的一步 。
肯定校验位的分组原则:每一个位数都由R一、R二、R3中的一或若干个所肯定。
说明:1由第一位R1来校验;2由第二位R2来校验;因为3=1+2(1和2指的是位数,都是2的n次方)因此3由第一位R1和第二位R2校验,4由第四位R3校验,5和3道理是同样的,5=1+4(2^0+2^2);6=2+4;7=1+2+4来校验,一次类推;
画表以下所示:
海明码位置 | 占用的校验位号 | 备注 |
1 | 1 | R1 |
2 | 2 | R2 |
3 | 1,2 | R1,R2 |
4 | 4 | R3 |
5 | 1,4 | R1,R3 |
6 | 2,4 | R2,R3 |
7 | 1,2,4 | R1,R2,R3 |
第四步:进行汇总,看每一个校验位都肯定了哪一位。
R1:一、三、五、7
R2:二、三、六、7
R3: 四、五、六、7
第五步:用亦或运算求出R一、R二、R3的值:(以R1为例)
普及:参加运算的两个对象,若是两个相应位为“异”(值不一样),则该位结果为1,不然为0。多个异或运算时,从左至右依次异或
第二行是对应的信息位上的数,如图求出R1=1
以此类推,求出值表以下
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息码 | 1 | 1 | 0 | 1 | |||
校验码 | 1 | 0 | 0 |
第五步第二种求法:
有此图的数据位置关系求值;
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息码 | 1 | 1 | 0 | 1 | |||
校验码 | R1 | R2 | R3 |
以R1为例: R1校验了1,3,5,7这四个位置,而这4个位置对应的值分别为 空、一、一、1,对着几个值 “异或运算”得1,即
R1校验的结果 1⊕1⊕1 = 1
R2校验的结果 1⊕0⊕1 = 0
R3校验的结果 1⊕0⊕1 = 0
以此类推,求出值表以下
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息码 | 1 | 1 | 0 | 1 | |||
校验码 | 1 | 0 | 0 |
第六步:读数
从位置1到7依次读出:1010101
完毕!很简单吧 -_-
思惟拓展
接收端如何检验和纠错呢
假设 信息传输前 1010101–>传输后 1000101
解析:
从1000101 获取到的信息码 是1001;校验码是 100 ;
求解1001的海明码,这里不累赘求解过程了,获得的 海明码是 :
由上面的第四步,肯定
R1校验 一、三、五、7
R2校验 二、三、六、7
R3校验 四、五、六、7
传输后端的数据 1000101 ,⊕表示异或运算
R1校验的结果 1⊕0⊕1 = 0
R2校验的结果 1⊕0⊕1 = 0
R3校验的结果 0⊕0⊕1 = 1
即校验位R1~R3 为 001 ;
001 不等于 100 因此传输过程当中数据出了问题 (检错)
开始纠错:
求出的校验位值和得到的校验位值异或运算 100⊕001,获得 101
101 即对应哪一个位置的值出错了, 2^2 + 2^0 = 5;
接收的数据 1000101 第5个位置出错了,与以前的假设吻合,将出错的值取反,即获得正确的值
全部正确的值为 1010101
一波很6的海明校验码操做!谢谢观看 !
在此很是感谢下面的这位博主,写的很好,一看就懂了,很是感谢!!