一篇文章彻底搞懂海明码
文章目录
- 海明码学习前提
- 前提:奇偶校验
- 概述:海明码的构成
- 1.算出校验位数k
- 2.确定校验位在海明码中的位置
- 3.分组(重点,很多人蒙圈就在此)
- 将1,2,4(海明码下标为1,2,4)
- 然后我们将0替换为*,作为通配表
- 我们将1到7的二进制序列,列出来如下表
- !!!重点!!!!
- 4.求出校验位是0还是1
- 5.查错
- 6.纠错
- 5位数数据
- 先求出校验位数:
- 画出表格
- 分组(*为通配符)
- 偶校验每个分组得出结果
临近期末,复习计算机组成原理,一篇文章教你搞懂海明码。
海明码学习前提
记住不要用异或套用公式!
学习海明码之前,我们要约定3个原则:
- 海明码只能检测出2位错,纠1位错(因此不要问如果3位错怎么办等幼稚问题)。
- 海明码默认进行偶校验(除非特殊说明使用奇校验)。
- 海明码是一串由0和1组成的序列(除01外没有其他的值,记住了!这是重点)。
如果下面有任何无法理解的问题,反复看上面三个原则,下面再也不赘述。
前提:奇偶校验
奇校验:这串序列1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。
偶校验:这串序列1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。
例子:1111
奇校验就是 11111
偶校验就是 01111
。
1110
奇校验就是 01110
偶校验就是 11110
。
特性是检测一位错,无法纠错。
概述:海明码的构成
例如如下序列:
1100
我们想要让其变成海明码只需如下操作。
1.算出校验位数k
正常情况下我们需要如下此操作:
2^k >= k + 数据位数 + 1
这里等于3
2.确定校验位在海明码中的位置
这里按2^k次幂留出来,就像1,2,4,8,16,32。(如果问有5位等其他烦人的数据位怎么办后面我会说,先按4位数做)
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 |
3.分组(重点,很多人蒙圈就在此)
我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。
我们按这个规则进行分配。
将1,2,4(海明码下标为1,2,4)
的二进制码写出来,并且最高位补到3位(前面算的K数)
如下所示:
1 | 2 | 4 |
---|---|---|
001 | 010 | 100 |
然后我们将0替换为*,作为通配表
1 | 2 | 4 |
---|---|---|
**1 | 1 | 1** |
我们将1到7的二进制序列,列出来如下表
7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|
111 | 110 | 101 | 100 | 011 | 010 | 001 |
!!!重点!!!!
我们将7->1依次与上面的通配表进行匹配
1 | 2 | 4 |
---|---|---|
**1 | 1 | 1** |
001(1) | 010(2) | 100(4) |
011(3) | 011(3) | 101(5) |
101(5) | 110(6) | 110(6) |
111(7) | 111(7) | 111(7) |
因此我们可以确定
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验
4.求出校验位是0还是1
因为上面我们得出以下结论:
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验
那 根据
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | |||
这张表,我们根据偶校验很容易就求出以下结论: | ||||||
H3,H5,H7 1的个数为奇数 因此H1=1 | ||||||
H3,H6,H7 1的个数为偶数 因此H2=0 | ||||||
H5,H6,H7 1的个数为偶数 因此H4=0 | ||||||
至此我们得出了完整的汉明码 |
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 1 |
5.查错
查错比较简单,如果以下三组
既
H1,H3,H5,H7
或者
H2,H3,H6,H7
或者
H4,H5,H6,H7
偶校验出错,则出错。
比方说 如果 H1,H3,H5,H7由1100 变成了 1110 (1的个数为偶数)就是出错了
这里该不赘述
6.纠错
首先我们先理解以下为什么海明码能纠错。
首先我们先画个圆。然后按如下形式做交叉
在每个相邻部位,我们做相加处理
变成了如下形式
当我们如果发现偶校验出错,
比方说在 1 3 7 5 这个区域出错。
如果这个位置出错了,那么一定是 1 3 7 5 这四个位置中的一个位置出错(如果俩位出错则无法纠错,这个点一定要记住)
如果此时其他的俩个组 即:2,3,6,7 和 4,5,6,7偶校验都通过了的话。
也就证明只可能是1出错
所以我们可以将 1 的位数 做修改。如果是0变为1,如果是1变为。来达到纠错的目的。
但是如果2,3,5,7这个位置也出错了,4,5,6,7这个位置没有出错。
我们很容易就推导出,是 3 这个位置出错了。
我们就可以修改3的值,如果是0变为1或者如果是1变为0.
在此时我们会发现一个巧妙的规则!
当我们把1,3,5,7 设为P1,
2,3,6,7设为P2
4,5,6,7设为P3时
当如果哪组校验失败就为1
P3 | P2 | P1 | 出错(第几)位数 |
---|---|---|---|
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
刚好是对应的二进制编码。就是这么绝。
其实学完海明码之后,我真的觉得人家实在是太聪明了。
5位数数据
至此,其实如果认真看上面的部分,大家已经可以理解海明码是如何实现的了。
但是我还是再带大家写一次。这种5位数的。关键在于如何分组!!!!!
比方说
10001
先求出校验位数:
2 ^ k > = k + 5 + 1
则 k = 4
画出表格
将1,2,4,8位置空出来,再将数据位填进去
H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 1 |
分组(*为通配符)
8 | 4 | 2 | 1 |
---|---|---|---|
1*** | 1* | *1 | ***1 |
8,9 | 4,5,6,7 | 2,3,6,7 | 1,3,5,7,9 |
偶校验每个分组得出结果
H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
一篇文章彻底搞懂海明码相关推荐
- 一篇文章彻底搞懂Android事件分发机制
本文讲的是一篇文章彻底搞懂Android事件分发机制,在android开发中会经常遇到滑动冲突(比如ScrollView或是SliddingMenu与ListView的嵌套)的问题,需要我们深入的了解 ...
- 一篇文章全搞懂!B2B
作为一名刚入行不久的电商新人,时常被各种专业名词搞的晕头转向,公司开会或者行业交流时候没听懂也只能假装呵呵一笑(话说这种呵呵一笑是什么态度!摔).痛心疾首,小编决定总结近期所有我听过的没听过的互联网专 ...
- 目标检测扩(六)一篇文章彻底搞懂目标检测算法中的评估指标计算方法(IoU(交并比)、Precision(精确度)、Recall(召回率)、AP(平均正确率)、mAP(平均类别AP) )
基本在目标检测算法中会碰到一些评估指标.常见的指标参数有:IoU(交并比).Precision(精确度).Recall(召回率).AP(平均正确率).mAP(平均类别AP)等.这些评估指标是在评估 ...
- mysql snowflake_一篇文章彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- 八、一篇文章快速搞懂MySQL 常见的数据类型(整型、小数、字符型、日期型详解)
常见的数据类型 1.数值型: 整型 小数: 定点数 浮点数 2.字符型: 较短的文本:char.varchar 较长的文本:text.blob(较长的二进制数据) 3.日期型: 一.整型 1)分类: ...
- 一篇文章彻底搞懂“分布式事务”
在如今的分布式盛行的时代,分布式事务永远都是绕不开的一个话题,今天就谈谈分布式事务相关的一致性与实战解决方案. 01 为什么需要分布式事务 由于近十年互联网的发展非常迅速,很多网站的访问越来越大,集中 ...
- 一篇文章快速搞懂C++生成随机数
使用rand()函数 头文件<stdlib.h> 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间. ...
- 一篇文章快速搞懂排序算法(含实现源码)
十大排序算法函数声明 时间复杂度表 主函数 #include<iostream> #include<cstdlib> #include<srand> using n ...
- 一篇文章快速搞懂十大排序算法(C++实现源码)
十大排序算法函数声明 时间复杂度表 主函数 #include<iostream> using namespace std;void BubbleSort(int length, int a ...
- cookie是什么?有什么用?cookie详解,一篇文章彻底搞懂cookie
Cookie是什么 cookie的中文翻译是曲奇,小甜饼的意思.cookie其实就是一些数据信息,类型为"小型文本文件",存储于电脑上的文本文件中. Cookie有什么用 我们想象 ...
最新文章
- 设计模式系列·抽象工厂模式
- 自动化测试现状趋势解读,附带近年自动化测试常用工具
- 每天一个linux命令(49):at命令
- mysql 创建用户与授权
- 音视频技术开发周刊 | 149
- 743. 网络延迟时间
- mysql使用sql语句查询数据库所有表注释已经表字段注释
- 【服务器】【私有云】宝塔安装KodExplorer
- 相声登上直播平台 传统艺术能借风口浴火重生吗?
- 严重的PHP缺陷可导致QNAP NAS 设备遭RCE攻击
- 加快黑群晖套件中心的套件下载速度
- 通过银联跨行转账、转接的交易手续费用——2358原则
- iOS小技巧11-Xcode中相对路径和绝对路径的使用
- 产品学习:变电站智能机器人巡检系统设计
- 数据解读热门美剧 | 《权力的游戏》花式死亡图鉴
- Vue学习--子组件向父组件传值
- php 二码合一支付_关于微信支付与支付宝支付前端这块二码合一的方法记录
- DirectX Gammer 设置
- 解答Java初级程序员该如何解决这些问题
- 总结陈丹琦博士论文(二):NEURAL READING COMPREHENSION AND BEYOND
热门文章
- 如何解开payload.bin获取包括Android内核在内的系统镜像文件?payload.bin解包教程
- IntelliJ产品C盘瘦身
- java使用HttpURLConnection检索网站时403错误处理方式
- 只道情深,奈何缘浅!
- 3d红苹果html,青苹果红苹果食疗功效大不同
- 加油中国,雄起汶川-快乐工作,快乐生活(多图)
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
- Java实现电子表格的创建
- mysql获取autoincrement_MySQL获取Auto_increment字段刚插入的值 | 学步园
- unbuntu安装MySQL