汉明码(海明码)你了解多少?带你探秘背后秘密

汉明码(海明码)

为什么有汉明码?

在计算机存储中,可能受其它原因,导致存储出现错误,0变成1,1变成0,存放数据以汉明码的方式存储,可以进行数据的校正,具有一位纠错能力

分组校验

在介绍汉明码之前举一个例子说明一下分组校验:比如有一个字节的数据 1000 0101

黄色为检验位

数据说明
1 1010 0001该数据1的个数为奇数,则可以得知1010 0001里面某一位出现错误
01010 1 0001该数据1的个数为奇数,则可以得知1010 或0001里面某一位出现错误

从表格中可以看出如果添加的检测位越多可以找到出错的范围越精确,当然这种分组校验组和组之间是不重复的,而海明码的组和组之间是重复的,很巧妙的重复能够精确的找到哪一位出现了错误。

汉明码的原理

将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:2k≥n+k+1

添加检测位数

2 k ⩾ n + k + 1 2^k \geqslant n+k+1 2kn+k+1
比如:二进制数据有4位 1011匿名检测位需要3位,因为23 = 4+3+1

检测位置

位 置 序 号 = 2 i ( i = 0 , 1 , 2 , 3 , 4 , . . . ) 位置序号=2^i(i=0,1,2,3,4,...) =2i(i=0,1,2,3,4,...)
如果有3个检测位,参考下面表格

位置序号1234567
二进制数据1011
说明检测位检测位数据位检测位数据位数据位数据位

分组原理

3个检测位,每个检测位划分一个组,第1组有1,3,5,7位;第2组有2,3,6,7位;第3组有4,5,6,7位。

在这里插入图片描述

位置序号用2i (i=0,1,2)分解包含二进制形式所属组
31+2xx1,x1x1,2
51+4xx1,1xx1,3
62+4x1x,1xx2,3
71+2+4xx1,x1x,1xx1,2,3
分组检测位序号二进制形式转换成十进制的位置序号
11(20xx11,3,5,7
22(21x1x2,3,6,7
34(221xx3,5,6,7

如何编码?

检测取值

检测位的取值和该位所在的检测组的奇偶校验方式有关。

  • 偶校验:该检测组的1的个数(不包括检测位)为偶数时,检测位为0,为奇数时检测位为1
  • 奇校验:该检测组的1的个数(不包括检测位)为偶数时,检测位为1,为奇数时检测位为0

偶校验

位置序号1234567
二进制数据0110011
说明检测位检测位数据位检测位数据位数据位数据位

奇校验

位置序号1234567
二进制数据1011011
说明检测位检测位数据位检测位数据位数据位数据位

如何校验?

给出一段7位奇校验海明码,在上面数据基础上把6号位的1变为0

位置序号1234567
二进制数据1011001
说明检测位检测位数据位检测位数据位数据位数据位

开始校验

位置相应检测位和数据位1的个数(包含检测位)结果
p44,5,6,72(偶)1
p22,3,6,72(偶)1
p11,3,5,73(奇)0

把位置从大到小排列并写出相应的结果 110 转换成10进制就是6,所以6号位置的数据出错,不同的结果以此类推。

注意:
把3个位置从大到小排列并写出相应的结果
在校验过程中,可以有3种判断方法:

1.查找相应检测位和数据位1的个数找奇偶,如果个数为偶,在偶校验里面为0,奇校验中为1;如果个数为奇,在偶校验里面为1,奇校验中为0

2.直接相加相应检测位和数据位看数值的奇偶,如果个数为偶,在偶校验里面为0,奇校验中为1;如果个数为奇,在偶校验里面为1,奇校验中为0

3.相应检测位和数据位进行异或运算,偶校验直接是异或运算结果,奇校验还要对结果取反。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值