纠错编码-海明码

一.海明码

海明码只能发现双比特错误,纠正单比特错误

二.工作原理

“动一发而牵全身”,因为海明码是一个多重校验码,也就是码字中的信息码位同时被多个校验码进行校验

三.工作流程

1.确定校验码位数

海明不等式2^r>=k+r+1,r为冗余信息位,k为信息位

eg:要发送的数据为D=101101

则数据的位数k=6

满足的不等式最小r为4

也就是D=101101的海明码应该有6+4=10位,其中原始数据6位,校验码4位

2.确定校验码和数据的位置

还是上面的那个例子D=101101,假设这4位校验码分别为P1,P2,P3,P4,数据从左往右为D1,D2...D6

校验码必须是在2n次方位置,如第1、2、4、8、16、32,...位(对应2^0 2^1 2^2 2^3 2^4 2^5……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,...位(是从最左边的位数起的)

? ? ? ? ? ? ? ? ? ? ?
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 1 0 1 1 0 1

3.求出校验码的值

                                                D=101101
? ? ? ? ? ? ? ? ? ? ?
二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 0 0 1 0 0 1 1 1 0 1

可以看出P1对应的二进制第一位为1(看二进制是几位的话就看最后一个数据位是几位二进制格式)可以发现D1,D2,D4,D5对应的二进制第一位也是1,则P1代码校验的数据为D1,D2,D4,D5

令所有要校验的位异或=0(即同0异1)

1 0 1 0

P1⊕D1⊕D2⊕D4⊕D5⊕=0 可推出P1=0

1 0 0

同理P2对应的二进制第二位是1,则P2代码校验的数据为D1,D3,D4,D6

1 1 1 1

P2⊕D1⊕D3⊕D4⊕D6⊕=0 可推出P2=0

0 1 0

同理P3对应的二进制第三位是1,则P3代码校验的数据为D2,D3,D4

0 1 1

P3⊕D2⊕D3⊕D4=0 可推出P3=0

1 0

同理P4校验的数据为D5,D6

0 1

P3⊕D5⊕D6=0 可推出P4=0

1

具体的计算方法我参阅了http://www.cnblogs.com/scrutable/p/6052127.html,即

p1(第1个校验位,也是整个码字的第1位)的校验规则是:从当前位数起,校验1位,然后跳过1位,再校验1位,再跳过1位,....。这样就可得出p1校验码位可以校验的码字位包括:第1位(也就是p1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,...。然后根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p2(第2个校验位,也是整个码字的第2位)的校验规则是:从当前位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。这样就可得出p2校验码位可以校验的码字位包括:第2位(也就是p2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p3(第3个校验位,也是整个码字的第4位)的校验规则是:从当前位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。这样就可得出p4校验码位可以校验的码字位包括:第4位(也就是p4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p4(第4个校验位,也是整个码字的第8位)的校验规则是:从当前位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。这样就可得出p4校验码位可以校验的码字位包括:第8位(也就是p4本身)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

综上所诉101101的海明码为0010011101

4.检验并纠错

                                               D=101101
? ? ? ? ? ? ? ? ? ? ?
二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 0 0 1 0 0 1 1 1 0 1

故101101的海明码为0010011101

假设第五位出错,因此接收到的数据位为00101111101

对所有要校验的位异或运算

0 1 1 1 0

P1⊕D1⊕D2⊕D4⊕D5⊕=1

1 0 1 1

0 1 1 1 1

P2⊕D1⊕D3⊕D4⊕D6=0

1 0 1 0

0 1 1 1

P3⊕D2⊕D3⊕D4=1

1 0 1

1 0 1

P3⊕D5⊕D6=0=0

1 0

从P4往P1写可得到0101,即二进制序列为0101,恰好对应的二进制5,这样就找到了出错的位置,即出错位是第五位

原文地址:https://www.cnblogs.com/buxiu888/p/12587759.html

时间: 2024-11-01 22:28:19

纠错编码-海明码的相关文章

计算机系统知识(一)—海明码

海明码校验 当计算机存储或移动数据时,可能会产生数据位错误.这时能够利用汉明码来检測并纠错,简单的说,汉明码是一个错误校验码码集. 了解海明码之前先了解一下异或: 异或的数学符号为"⊕".计算机符号为"xor".其运算法则为: a⊕b = (?a ∧ b) ∨ (a ∧?b) 假设二进制下用1表示真,0表示假.则异或的运算法则为: 0⊕0=0, 1⊕0=1, 0⊕1=1. 1⊕1=0(同为0,异为1).  海明码的编码步骤: 1. 依据信息位数,确定校验位数,2r 

洛谷 P1461海明码 Hamming Codes 枚举 搜索

洛谷 P1461海明码 Hamming Codes枚举 搜索 1 #include <bits/stdc++.h> 2 using namespace std ; 3 4 const int N = 11 ; 5 int mx,B,n,D ; 6 int bin[N] ; 7 struct base{ 8 bool f[ N ] ; 9 inline void clear() { 10 for(int i=1;i<N;i++) f[ i ] = 0 ; 11 } 12 inline vo

洛谷 P1461 海明码 Hamming Codes

P1461 海明码 Hamming Codes 题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7).“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目.看下面的两个编码 0x554 和 0x234(0x554和0x234分别表示两个十六进制数): 0x554 = 010

奇偶效验码和海明码

奇偶效验码 奇偶校验码是奇校验码和偶校验码的统称.它们都是通过在要校验的编码上加一位校验位组成. 奇校验码:加上校验位后,编码中 1 的个数为奇数个. 偶校验码:加上校验位后,编码中 1 的个数为偶数个. 水平奇偶效验码 例: 原编码 奇校验 偶校验 0000 0000 1 0000 0 0010 0010 0 0010 1 1100 1100 1 1100 0 1010 1010 1 1010 0       垂直奇偶效验码 例: 有32位数据 10100101 00110110 110011

计算及校验海明码的3个举例

海明码具有检错纠错能力,用于传输质量较好的信道,因为出错太多检测不出来. m位数据需要满足具有r位校验码 m+r ≤ 2r-1 校验位放在2n位置上,如??1? 111? 1111 111? 111... 校验码依次在20. 21. 22. 23. 24位置上,有的是从后往前写的,结果不影响,知道怎么算就行. 例1,计算1011的海明码及检验 一.算校验位 原数据1011, 有4位数据位, 需满足4+r≤2r-1这个公式, 求得r=3,表明有3个检验位,以下用a.b.c....来代替 得到ab1

HAMMING CODES 海明码

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2324 题目大意:(如题) 输入输出:(如题) 解题思路: 简单搜索.按递增顺序搜索要求的n个数,然后跟前面的数判断距离是否大于d,找到的一组解即为最小的. 注意: 1.0在每组数据里面都出现. 2.b给出了搜索的最大值:2^b-1. 3.计算两个数a,b的距离,只要计算a^b的二进制形式中1的个数. 核心代码: int dist(int x,int y) { int cnt,tmp; cnt

【计算机组成原理】海明码

海明码也叫做汉明码,具有一位纠错能力. 编码: 确定校验码的位数x 设数据有n位,校验位有x位,则校验码一共有2的n次方种取值,其中需要一种取值方式表示数据正确,剩下2的n次方-1表示有一位数据出错,因此编码后的二进制串有n+x位,所以应该满足2的x次方-1>=n+x 以1010110为例,信息位有7位则校验位为4 确定校验位的位置:校验码在二进制串中的位置为2的整数幂 位置 1 2 3 4 5 6 7 8 9 10 11 内容 x1 x2 1 x3 0 1 0 x4 1 1 0 求校验位的值:

数据的表示和运算

总览: 数制与编码 进位计数制及其相互转换 真值和机器数 BCD码 校验码 定点数的表示和运算 定点数的表示 无符号数的表示,有符号数的表示 定点数的运算 定点数的位移运算,原码定点数的加/减运算,补码定点数的加/减运算,定点数的乘/除运算,溢出的概念和判别方法. 浮点数的表示和运算 浮点数的表示 IEEE754标准 浮点数的加/减运算 算术逻辑单元(ALU) 串行加法器和并行加法器 算术逻辑单元的功能和结构 数制与编码 进位计数制及其相互转换 二进制.八进制.十进制.十六进制相互转换 十进制转

数据链路层 差错控制

第三章 数据链路层 数据链路层协议有许多种,但有三个基本问题则是共同的.分别是:封装成帧.差错控制.透明传输. 参考:计算机网络 谢希仁 p71 王道MOOC哔哩哔哩(谷歌浏览器):https://www.bilibili.com/video/av40248430/?p=12 2020版王道 第一部分.封装成帧 第二部分.差错控制 一.差错从何而来 二.解决办法:差错控制(检验编码) 只针对位错/比特错,帧错在运输层讨论 实现无比特差错的传输,但这还不是可靠传输. 三.具体实现(只针对位错/比特