• 计算机组成结构 海明校验码


    照班一下海明效验码的定义:

    海明码(Hamming Code)是利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的确定位置插入k个校验位,通过扩大吗距来实现检错和纠错。对于数据位m的数据,加入k位的校验码,它应满足:

    2^k>m+k+1

    我一直感觉很难理解是因为校验位的位置每次都是20,21,23,..2k
    为什么是这个位置呢?
    我的理解是为了使用二进制表示所有的数,对于k位的2进制,最大可用表示的数字为2k-1,所以为码的长度m+k不能超过2k - 1
    这就是加入k位校验码的所能表示的极限。
    那么位于2^k的数字能表现的位只能是k位上取1的数。
    接下来举一个具体的例子来解释我的理解
    以1010110这个二进制数为例解释海明码的编码和校验方法。

    编码

    1.确定校验码的位数x

    设数据有n位,校验码有x位。则校验码一共有2x种取值方式。其中需要一种取值方式表示数据正确,剩下2x-1种取值方式表示有一位数据出错。因为编码后的二进制串有n+x位,因此x应该满足

    2x-1 ≥ n+x

    使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。

    2.确定校验码的位置

    校验码在二进制串中的位置为2的整数幂。剩下的位置为数据。如图所示。

    位置 1 2 3 4 5 6 7 8 9 10 11
    内容 x1 x2 1 x3 0 1 0 x4 1 1 0

    3.求出校验位的值

    位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
    内容 x1 x2 1 x3 0 1 0 x4 1 1 0

    为了求出x2,要使所有位置的第二位是1的数据(即形如**1*的位置的数据)的异或值为0。即x21101^0 = 0。因此x2 = 1。
    在图中是2、3、6、7、10、11位置是第二位是1的数据

    因此:因此1010110的海明码为01110100110。

    校验

    假设位置为1011的数据由0变成了1,校验过程为:
    将所有位置形如xxx1, xx1x, x1xx, 1xxx的数据分别异或。
    xxx1: 01001^1 = 1
    xx1x: 11101^1 = 1
    x1xx: 101^0 = 0
    1xxx: 011^1 = 1
    以上四组中,如果一组异或值为1,说明该组中有数据出错了。xxx1 xx1x 1xxx的异或都为1,说明出错数据的位置为1011。
    总结:海明码具有纠错的能力但只是错一位的情况
    如果需要纠错d位,需要码距为2d+1,检错d位需要的码距位d+1
    注:用例来自https://www.cnblogs.com/scrutable/p/6052127.html

  • 相关阅读:
    gcc链接g++编译生成的静态库和动态库的makefile示例
    gcc将多个静态库链接成一个静态库
    linux c redirect 重定向
    iOS开发如何提高
    致PHP路上的“年轻人”
    显示系统时间--带有秒数
    在 Linux 中使用日志来排错
    程序员必备:技术面试准备手册
    你的Java代码对JIT编译友好么?
    悟空:用Go语言编写的全文搜索引擎
  • 原文地址:https://www.cnblogs.com/shuibeng/p/13624478.html
Copyright © 2020-2023  润新知