后悔没早看!这样学汉明码,一辈子都难忘!

后悔没早看!这样学汉明码,一辈子都难忘!介绍了奇偶校验码 汉明码的原理基础 几个量的数学关系 汉明码检错方法

写在前面:大家好K。首先为你点进这篇有趣的文章点赞?!文章在撰写过程中难免有疏漏和错误,欢迎你在下方留言指出文章的不足之处;如果觉得这篇文章对你有用,也欢迎你点赞和留下你的评论。更多内容请点进?我的博客K。?阅览。

1. 什么是奇偶校验法?

  • 偶校验

一串01数字串中,如果有偶数个1,则表明这串数字是正确的,没有在传输过程中出错。

  • 奇校验

一串01数字串中,如果有奇数个1,则表明这串数字是正确的,没有在传输过程中出错。

缺点:奇偶校验只能在错一位时发现有错,如果同时错两位(或偶数位),这没办法校验出来。

但是同时多位出错的情况很少发生,所以奇偶校验法得到广泛应用。

例:

偶校验:如果你想要传输0101,传输前在开头加一位校验位0,这样传输的是00101,此时这串数有2个1,符合偶校验。

奇校验:如果你想要传输0101,传输前在开头加一位校验位1,这样传输的是10101,此时这串数有3个1,符合奇校验。

本文用偶校验法讲解汉明码

2. 非代码,通俗理解汉明码原理

现在不要管前面讲的,这是全新的东西。

假设现在要传输一个数有7位,位号为1、2、3、4、5、6和7。它们有如下关系:

三个大圆

  • 现在我们假设:这7位数中一定有一位是错的,而1号位所在大圈和4号位所在大圈一定是正确的,=>推得错的这一位一定是2号位;
  • 再假设:这7位数中一定有一位是错的,而2号位所在大圈是正确的,且1号位和4号位所在大圈同时出错了,=>那么错的这一位一定是5号位;
  • 同理,再假设:这7位数中一定有一位是错的,而此时所有大圈都出错了,=>那么错的这一位一定是7号位。

通过上面三个假设我们我们可以看到,我们都是以大圈为单位,根据三个大圈的出错情况(无错、1个错、2个错、3个全错)就可以推得到底是哪一位出错了。我们称第1、2、4号位为校验位

3. 汉明码如何分组、编码?

通过上面的简化例子可以发现,要实现上面的校验过程,有两步一定要做:1. 分组(上面的每个大圈为一组);2. 每组都有一个校验位(即上面的1、2和4号位)。那么具体是如何做的呢?

3.1 如何确定校验位?

我们先把1~7的二进制写出来,再看看每个二进制数的1在哪里:

1:0001 >>> XXX1('1'在第1号位) 2:0010 >>> XX1X('1'在第2号位) 3:0011 >>> XXX1、XX1X('1'在第1、2号位) 4:0100 >>> X1XX('1'在第3号位) 5:0101 >>> XXX1、X1XX('1'在第1、3号位) 6:0110 >>> XX1X、X1XX('1'在第2、3号位) 7:0111 >>> XXX1、XX1X、X1XX('1'在第1、2和3号位) 

我们可以看到只有1个1的位号(1、2和4号位)都是2n(20、21和22)。汉明码把这样2n号位作为校验位(上节中的大圈),这些位上的数称为校验码

3.2 如何分组?

我们通过举例子来说明。哪些位号应该和1号位组成一组呢(画大圈)?

答:1号位1的位置在第1位,形如XXX1,那么位号分解出来有XXX1的位,会和1号位一组。这里第3、5和7号位与1号位一组;

同理,2号位1的位置在第2位,形如XX1X,那么位号分解出来有XX1X的位,会和2号位一组。这里第3、6和7号位与2号位一组。

4号位的分组亦同理易得。

3.3 汉明码如何编码?

通过上两小节,我们知道了如何确定校验位和如何分组,那么该如何将原始数据编码成汉明码呢?

我们也通过例子来说明。我们现在给0101编码。

我们先写成这种形式:_ _ 0 _ 1 0 1。留的空白就是校验位(2n号位)。

且第1、3、5和7号位为一组(_ 0 1 1),第2、3、6和7号位为一组(_ 0 0 1),第4、5、6和7号位为一组(_ 1 0 1)。

前面说过,本文以偶校验法来讲解汉明码。现在以组为单位(大圈),看看每组的校验位_都填啥。显然,第1号位填0,第2号位填1,第4号位填0。使得每组的1的个数为偶数。

所以对于0101,编码后得到的汉明码为0

偶校验码的计算机生成由异或操作实现。如第一组的校验码0实际由该组其他位上的数0⊕1⊕1。奇校验码由同或操作实现。

4. 数学关系

我们可以发现,上面示例中有3个校验位,可以校验最多7位数(3个校验码+4个原始数据)。

即有k位校验位,最多可以得到有2k-1位数的汉明码:

2k-1 >= k+n(n为原始数据的位数)

5. 如何知道哪位错了?(检错方法)

提醒:依旧是在易错1位的基础上讨论

我们按照分组方法,将接收到的一串汉明码同样分成几组。手动计算每组信息是否与校验码匹配,再画大圈找到错的那一位数。昂?是这样吗?P!

当接收到的位数很多时,肯定不能手动计算出错位,画大圈都要画成憨憨。事实上,汉明码有一种非常快速的找到错位的方法。

继续上面的例子,我们发送的汉明码为0,但是接收到的数为0。我们以接收者的角度来说,乍一看并不能确定哪一位是错的(只能错一位),但是这是优秀的汉明码啊!大哥!看看怎么找出错位来的吧!

我们将0按分组方法分成三组(注意三组按校验位从小到大写):

第一组:0011,校验正确,标记为0 第二组:1001,校验正确,标记为0 第三组:1101,校验错误(偶校验这里校验位应为0才能保证这组'1'的个数为偶数),标记为1 

将标记倒序写出来是100,写成十进制数为4,所以这串数字的第4位出错了,应该反过来为0。由此可以确定接收到的0是错误的,正确串应该是0

这个方法口诀为正确标0错标1,分组校验倒叙查

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217931.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:26
下一篇 2026年3月18日 上午8:27


相关推荐

  • linux某用户 计划任务,Linux计划任务管理

    linux某用户 计划任务,Linux计划任务管理Linux计划任务管理前言:在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中默认已安装了at、cronie软件包,通过atd和crond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、crontab命令进行计划任务设置。一、at命令一次性计划任务前提条件:对应的系…

    2022年7月13日
    17
  • 阿里云申请免费DV SSl(https证书),及详细配置运用[通俗易懂]

    阿里云申请免费DV SSl(https证书),及详细配置运用[通俗易懂]概述(大体流程):申请好免费证书后,一键推送到负载均衡,然后再给负载均衡配置443端口监听,并选择相应的证书!1、在阿里云购买证书说明:免费版的只能针对特定的一个域名(如果有多个域名,那就多买几个免费的)注意:在里面挨个挨个点乱点,这个免费的隐藏得有点深,不容易出的来(Symantec里面才有免费版的)创建证书,在【证书列表】中选择自己购买的那个2、配置证书…

    2022年10月1日
    7
  • java实现数据库同步的方法_java数据库同步中间层使用

    java实现数据库同步的方法_java数据库同步中间层使用之前也有用过数据库的同步中间件比如阿里的canal,最近突发奇想,自己使用Java进行不同数据库品牌的数据库同步,比如Oracle同步到MySQL,等等;正文…

    2022年10月15日
    6
  • 什么是主键和外键?

    什么是主键和外键?一 什么是主键 外键 关系型数据库中的一条记录中有若干个属性 若其中某一个属性组 注意是组 能唯一标识一条记录 该属性组就可以成为一个主键 nbsp 比如 nbsp nbsp 学生表 学号 姓名 性别 班级 nbsp 其中每个学生的学号是唯一的 学号就是一个主键 nbsp 课程表 课程编号 课程名 学分 nbsp 其中课程编号是唯一的 课程编号就是一个主键 nbsp 成绩表 学号 课程号 成绩 nbsp 成绩表中单一一个属性无法唯一标识一条记录 学号和课程号的组合才可

    2026年3月19日
    3
  • 十款常用Linux系统介绍「建议收藏」

    十款常用Linux系统介绍「建议收藏」你可曾知道Linux的魅力或威力来自哪里?那就是,由于众多发行版百花齐放,Linux的阵营日益壮大,每一款发行版都拥有一大批用户,开发者自愿为相关项目投入精力。Linux发行版可谓是形形色色,它们旨在满足每一种能想得到的需求。本文就是为了简述某一款发行版为何存在、该发行版的目标用户是哪些,以及它与其他发行版相比有什么样的特殊功能。1.DebianDebian运行起来极其稳定,这使得它非常…

    2022年6月7日
    88
  • oracle 拼接字符串的两种方式「建议收藏」

    oracle 拼接字符串的两种方式「建议收藏」 方式一:使用管道符||进行拼接方式二:使用concat()函数区别:  方式一可以拼接多个字符串;方式二只能将2个字符串拼接到一起。写在最后  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!! 相关推荐:个人主页  …

    2026年1月29日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号