文章目录
- 一、前言
- 二、奇偶校验码
- 三、海明码概念
- 四、十六宫格法
- 1.概述
- 2.原理
- 3.填写校验位
- 4.填写数据位
- 5.填写十六宫格首位
- 五、结语
一、前言
很多小伙伴在遇到“汉明码”相关的题目时,看了很多的视频,很多文章可能还是云里雾里,作者在备考软考的时候也遇到了相同的疑惑,在看了一个从油管翻译过来的视频后,总结了这个方法
二、奇偶校验码
在有关于“海明码”的题目时,就需要用到它。简单来说,就是看 二进制数中1的个数;一般我们采用 偶校验,即 二进制数中1的个数为偶数
三、海明码概念
-
Pi 为
校验位
-
Di 为
数据位
-
Hi 为
海明码
-
Pi 的海明码在第 2i-1 的位置
-
数据位是
n
位,校验位是k
位,则 2k-1 ≥ n+k
四、十六宫格法
1.概述
简单来说,就是将校验码位和数据位填入一个4×4的格子内,并通过这个方法来求一个数据的海明码
2.原理
为了最大效率的检测出是哪一位数据出错,所以采用以下方法:
- 第一次:检测第2、4列,即下图所示,看这两行中1的个数是否为偶数(这里用到的就是上面所说的偶校验方式)如果个数是偶数,那么这两行数据没有出错,或者有2个及以上偶数个错误,但是在我们做题中不考虑这种情况,默认错误的位数为1
- 第二次:检测第3、4列,如下图所示,同理,看这两行中1的个数是否为偶数(这里用到的就是上面所说的偶校验方式)如果个数是偶数,那么这两行数据没有出错,或者有2个及以上偶数个错误,但是在我们做题中不考虑这种情况,默认错误的位数为1
- 第三次:检测第2、4行,如下图所示,看这两行中1的个数是否为偶数(这里用到的就是上面所说的偶校验方式)如果个数是偶数,那么这两行数据没有出错,或者有2个及以上偶数个错误,但是在我们做题中不考虑这种情况,默认错误的位数为1
- 第四次:检测第3、4行,看这两行中1的个数是否为偶数(这里用到的就是上面所说的偶校验方式)如果个数是偶数,那么这两行数据没有出错,或者有2个及以上偶数个错误,但是在我们做题中不考虑这种情况,默认错误的位数为1
3.填写校验位
由于我们都采用的二进制数,那么第一个格子对应的就是0000
,化作十进制就是第0号位置
,注意这里的位置号与海明码Hi是有区别的从左到右,从上到下依次是015。前面已经说了**校验码的位置是第2i~个位置**,那么我们就可以把校验位先填入其中
4.填写数据位
这里会比较绕,建议大家在第一次看文章的时候可以亲自动手操作一下,为了方便大家理解,这里举的例子是 ==《软件设计师教程》P12的例1.6==如果没有书也没有关系,题目如下
设数据为01101001,试采用4个校验位求其偶校验方式的海明码
第一步
首先我们画出12根横线(8个数据位
+4个校验位
),从右向左,从1开始数,第1、2、4、8
个位置用来放我们的校验码,先空着
,剩下的 从左向右填入横线中
这里画横线填写数据的意义是方便大家将数据填入十六宫格中
在数的时候记得给每个空格标上数,数据位用D表示,校验位用P表示
第二步
将D0 至 D7依次填入十六宫格中, 从P1后的位置填写 如果发现填不满也没有关系,剩下的可以空着,第一个格子先不要填写任何数字
第三步
将数据位对应的数字填入其中后,采用偶校验的方式补全校验位
例如
P1校验:第二列和第四列,P1、D1、D4、D0、D3、D6 这几位对应数字:0、0、1、1、1
,有3个1,那么为了确保数据准确,需要偶数个1的话,P1应该为1,这样这两列就有4个1
以此类推可以算出每一个校验位
5.填写十六宫格首位
在开头说了,如果有偶数个1的话可能有2个及以上的偶数个错位或者没有错误,为了保证数据准确性,在填写完十六宫格后要数所有格子内1的个数,并保证1的个数为偶数个
如果1的个数是奇数个,那么首位为1,如果为偶数个,首位为0
五、结语
海明码虽然现在使用已经不多了,但是在面临考试的时候依然是难点,希望本文能给与大家帮助,有任何问题可以留言评论