海明码简单分析(方法1)
海明码(也叫汉明码)具有一位纠错能力。本文以1010110这个二进制数为例解释海明码的编码和校验方法。

编码

  • 确定校验码的位数x
    设数据有nnn位,校验码有xxx位。则校验码一共有2x2^x2x种取值方式。其中需要一种取值方式表示数据正确,剩下2x−12^x-12x−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+xn+xn+x位,因此xxx应该满足2x−1≥n+x2^x-1\geq n+x2x−1≥n+x使不等式成立的x的最小值就是校验码的位数。在本例中,n=7n=7n=7,解得x=4x=4x=4。
  • 确定校验码的位置
    校验码在二进制串中的位置为2的整数幂。剩下的位置为数据。如图所示。
  • 求出校验位的值
    以求x2的值为例。为了直观,将表格中的位置用二进制表示。

    为了求出x2,要使所有位置的第二位是1的数据(即形如**1*的位置的数据)的异或值为0。即x2^1^1^0^1^0 = 0。因此x2 = 1。
    同理可得x1 = 0, x3 = 1, x4 = 0。
  • 因此1010110的海明码为01110100110

校验
假设位置为1011的数据由0变成了1,校验过程为:

将所有位置形如***1, **1*, *1**, 1***的数据分别异或。

***1: 0^1^0^0^1^1 = 1
**1*: 1^1^1^0^1^1 = 1
*1**: 1^0^1^0 = 0
1***: 0^1^1^1 = 1

以上四组中,如果一组异或值为1,说明该组中有数据出错了。***1 **1* 1***的异或都为1,说明出错数据的位置为1011。


海明码简单分析(方法2)
确定校验位个数
海明码的码组长度需要符合:2r–1(r代表校验位个数)2^r – 1 (r代表校验位个数)2r–1(r代表校验位个数)

为什么是这个公式呢?因为:只有这样才能保证校验位足够覆盖整个需要校验的码组。

比如说:校验位有3位,那就是23=8–1=72^3 = 8 – 1 = 723=8–1=7这样就可以校验长度为7的码组,如果按实际来说,也就是信息位 4 位,校验码 3 位。

通过上面分析,我们知道校验位rrr加上信息位 kkk 就等于2r–12^r – 12r–1, 这也就是为什么书上有k+r<=2r–1k + r <= 2^r – 1k+r<=2r–1 的原因,下面是一些 R 和 K的关系表

注:表中数据取自网络

确定校验位的位置
知道了需要多少位校验码,还需要知道把校验码放在哪个位置上才行,这个只要记住,信息位在非2n的位置上,而校验位是在2n的位置上就可以了,条件再严格点就是,书上说的信息位所在海明码中的下标是需要等于前面几个校验组的下标,看到这里不懂没有关系,下面进行简单的例题分析。

举个粟(例)子:
信息字码组 : 1101 , 这时候信息位 k=4k = 4k=4, 根据 k+r<=2r–1k + r <= 2^r – 1k+r<=2r–1 ,得出r=3r = 3r=3 , 那就按书上说的,用P1、P2、P3来表示这3位校验码,这时候我们就来做填字格游戏。

P1 P2 1 P3 1 0 1

位置就这么简单的确定下来了,如果位数更多的话也是一样的,校验位就是在 1、2、4、8、16…….这些位置上。

计算校验位 Pi
上面已经知道要在什么位置插入校验码,现在就差下锅的料了,怎么求校验位实际的值呢?很简单!

根据海明码定义,是通过将信息进行分组,才得以实现检错和纠错的能力,就像一开始的图,每一个Pi都会包含3个信息位。

问题来了,那我怎么知道这些信息位是哪几个?还是书上的定义……

重点

比如说信息 1 1 0 1 ,从上面填字格游戏我们可以看出,被分别安排在 H3,H5,H6,H7的位置(这些位置怎么来的?7位数从1到7给每位编号嘛!)

则:H3 = H1+H2 (这里是等式右边下标相加等于等式左边下标的意思,下面一样)

H5 = H1+H4
H6 = H2 + H4
H7 = H1 + H2 + H4

通过上面的关系式,我们可以看出,右边在海明码中的数位,正好都是校验码的位置,下面来正式求校验码了。

P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7

大功告成!啥?还要我算出来?打字很累的,手短打字又慢,行吧行吧,想在以前自己学海明码,怎么看都不会的份上,可能也是自己太笨…….

信息码:1101 对应海明位 H3、H5、H6、H7,不要把海明码,校验位,信息位搞混了哦!虽然我也是经常弄混哈哈!

P1 = 1 ⊕ 1 ⊕ 1 = 1;
P2 = 1 ⊕ 0 ⊕ 1 = 0;
P3 = 1 ⊕ 0 ⊕ 1 = 0;

啥?异或不懂?没关系,我也经常不懂,相同 = 0 ,不同 = 1,异表示不同,按或的规则,是不是好奇葩!

好了,现在我们可以完成填字游戏了 P1 P2 1 P3 1 0 1 ==> 1010101,这就是我们最后需要得到的海明码,终于完成了!

还没完呢……有了这个海明码还需要知道怎么校验有没有出错啊,简单简单,跟我继续来学习!

海明码纠错和检错
有了上面的校验码和信息码,我们就能借用他们去知道怎么检查,信息在传送的过程中有没有发生错误,废话不多说,下面开始,还是书上的定义,因为校验码有三位,我们这里再申明三位码分别用S1、S2、S3表示,满足下列关系:

S1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;
S2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;
S3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;

这样求出来的S1、S2、S3如果都为0就是没有出错,如果不是0就表示在海明码中出错的位置,将其取反就可以起到纠错的功能了。很简单吧,等等,为什么是上面的关系式?哪来的?可以往上看看求校验码那里,这就是分组的结果,这里我就偷懒下不算了,你们可以自己算算,真的结束了……


以上博文转载自:

  1. 方法1:lyyufenfei_(看得懂的)海明码的编码和校验方法
  2. 方法2:http://www.yuyanping.com/the-basic-of-hamming-code/

易理解的海明码的编码和校验原理【转载】相关推荐

  1. (看得懂的)海明码的编码和校验方法

    转载自:http://www.cnblogs.com/scrutable/p/6052127.html 看了半天就这个看懂了.所以转载了. 海明码(也叫汉明码)具有一位纠错能力.本文以1010110这 ...

  2. 海明码的编码和校验方法(易懂)

    转载自:http://www.cnblogs.com/scrutable/p/6052127.html 海明码(也叫汉明码)具有一位纠错能力.本文以1010110这个二进制数为例解释海明码的编码和校验 ...

  3. 海明码编码和校验原理与实现【转载】

    海明编码与检验原由 以内存为例, 如果内存所处的电磁环境比较复杂, 或者空间环境下受到带电粒子的打击, 那么可能导致电容的充放电或者触发器的翻转(SRAM). 这样会导致存储信息的改变. 如果不校验, ...

  4. 汉明码(海明码)计算,模板套用易懂!

    汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名. 本文以101101100这个二进制数为例解释海明码的编码和校验方法. 首先我们要知道汉明码是 ...

  5. 检错纠错理论——海明码与海明距离

    概念解释 先说明几个概念(非严谨定义) 码字:一个包含了数据位和校验位的n位单元,也就是"一种"编码 编码:由码字组成的可以表达传递信息的集合,这里不是指编码的过程,而是一个名词. ...

  6. 软考学习笔记1-计算机数字的码制(原码,反码,补码,移码,奇偶校验码,海明码以及循环冗余码)表示

    机器数有:0表示正号,1表示负号 1. 原码 以八位二进制为例,第一位是符号位: 则原码的取值范围是[1111 1111,0111 1111],也就是[-127,+127] Eg:A=+10 0101 ...

  7. 海明码检错与纠错,经典例子讲解~

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  8. 海明码(汉明码)详解

    海明码简介 海明码是由Richard Hanming于1950年提出的,它具有一位纠错能力. 海明码的计算 设欲检测的二进制代码为n位,为使其具有纠错能力,需要添加k位检测位,组成n+k位的代码.为了 ...

  9. 3.3.1网络原理数据链路层之差错控制(检错编码和纠错编码)->(奇偶校验码、CRC循环冗余码、海明码)(转载)

    原文链接:https://blog.csdn.net/weixin_43914604/article/details/104864783 本博客为个人学习.研究或者欣赏用,如有侵权,请与我联系删除,谢 ...

最新文章

  1. Go并发编程之美-Load/Store操作
  2. 30天敏捷生活(9-11):调整30天的节奏
  3. 海量数据库解决方案2011031701
  4. python函数名第一类方法、f-string格式化、迭代器及递归函数
  5. Linux中printk和strace命令调试的一些技巧
  6. Tensorflow学习教程------tensorboard网络运行和可视化
  7. SAP Spartacus payment detail page的CMS模型
  8. linux的ctrl alt f6的作用,Linux(Centous6.4)操作系统中,快捷键Alt+Ctrl+F10是什么作用?...
  9. linux摄像头内核驱动开发,怎么在Linux下开发摄像头驱动
  10. 如何给影像添加投影_地面互动投影是如何实现的,需要哪些设备?
  11. Android8.0(34)----Android 8.0 Settings流程分析与变动
  12. myeclipse中文界面改颜色_“颜色识别器”安卓APP功能详细介绍
  13. iOS精品源码,GHConsole图片浏览器圆形进度条音视频传输连击礼物弹出动画 1
  14. 学生选课系统代码-2view视图层代码【MVC--v】代码
  15. PyCharm 2020安装(免费版)
  16. merge squash 和 merge rebase 区别 GIT使用
  17. java学习之路-练习题:编写一个计算速度的程序,距离时间常量。
  18. 7iso 快门 光圈
  19. jmeter将上一个接口的返回值作为下一个接口的参数
  20. byval 和byref的区别,今天刚明白。

热门文章

  1. Oracle数据库表中字段顺序的修改方法
  2. 容器编排技术 -- Kubernetes 在 Namespace 中配置默认的CPU请求与限额
  3. Java设计模式 - 示例教程
  4. Vue 调试工具 vue-devtools 安装及使用
  5. 【C语言】创建一个函数,判断某一正整数是否为素数,并调用这个函数找出1000以内所有素数...
  6. C#设计模式之2-抽象工厂模式
  7. 在react中使用定时器
  8. 从头开始开发gis_DevRel工程师一:从头开始建立开发人员关系团队
  9. 机器学习与分布式机器学习_这就是为什么任何人都可以学习机器学习的原因
  10. 蓝牙配对不弹配对框_配对编程在工作场所的好处和陷阱