计算机组成原理部分笔记

海明校验

☆海明码是什么?

海明码是一种可以对数据校验,并至多可以校正一位出错的校验方法。

海明码有以下特点:

  • 海明码使用多重奇偶校验
  • 海明码可以校正一位出错,并且可以指出出错的位置。
  • 即使,校验位出错,对海明码的校验也没有影响。
  • 海明码的校验位长度有规定。

海明码有n位数据和k位校验码组成n+k位,即p = n + k。海明码可生成k位的指示码$G_kG_{k-1}…G_1$

☆ 海明码的生成:

假如有4个要传输的数据位,即n=4。

海明码的校验位数k与数据位数n需满足:$2^k\ge n+1$(稍后解释) ,因此k取3。

于是我们有4位数据位,3位校验位,共七位。将3位校验位放到第2^i-1^ (i=1,2,3,…)位置上,数据位放到校验位的空隙中。如下表所示:

索引(从1开始) 1 2 3 4 5 6 7
数据位/校验位(k表示校验位,n表示数据位) k1 k2 n1 k3 n2 n3 n4
实际数据 待定 待定 1 待定 0 1 1

接着计算校验位 k1, k2, k3

根据使用的校验方式不同,选择不同的校验方式(奇校验 / 偶校验),以偶校验为例:

$k_1=p_3\oplus p_5\oplus p_7=0$

$k_2=p_3\oplus p_6\oplus p_7=1$

$k_1=p_5\oplus p_6\oplus p_7=0$

这样我们得到:

索引(从1开始) 1 2 3 4 5 6 7
数据位/校验位(k表示校验位,n表示数据位) k1 k2 n1 k3 n2 n3 n4
实际数据 0 1 1 0 0 1 1

k~1~ (001) 是 3 (011), 5 (101), 7 (111) 的偶校验位

k~2~ (010)是 3 (011), 6 (110), 7 (111) 的偶校验位

k~3~ (100) 是 5 (101), 6 (110), 7 (111) 的偶校验位

每个校验位的生成方法可归纳如下:首先校验位和数据位的索引变化成二进制形式,因为校验位只出现在2^i-1^ (i=1,2,3)的位置,因此校验位索引的二进制形式只有一个位置是1。对于其他的数据位,如果其索引的二进制形式的某个位置为1,且这个位置与某个校验位索引为1的位置相同,那么这个数据位就要参与这个校验位的生成。

☆ 海明码的检验与校正:

当我们收到一个带海明校验的数据,我们对所有的校验位进行校验,并将得到的结果作为指示位$G_kG_{k-1…G_1}$。

对于上面的例子

索引(从1开始) 1 2 3 4 5 6 7
数据位/校验位(k表示校验位,n表示数据位) k1 k2 n1 k3 n2 n3 n4
实际数据 0 1 1 0 0 1 1

$G_1 = k_1\oplus p_3\oplus p_5\oplus p_7=0$

$G_2 = k_2\oplus p_3\oplus p_6\oplus p_7=0$

$G_3 = k_3\oplus p_5\oplus p_6\oplus p_7=0$

由于$G_3 G_2 G_1=000$ ,因此数据无误。

若第六位出错,$G_3 G_2 G_1=110$ 刚好指出了错误的位置,我们只要将第六位取反即可纠正。

☆ 海明码的原理^[1]^:

  • 海明码由n位数据位和k位校验位组成,校验位可以指出数据出现错误的地方。

    k位校验位可以表示 2^k^ 中状态,因此若要能指出每一位可能发生错误的地方,2^k^ >= n

    又因为,校验位必须还可以表示数据没有出错的情况,因此校验位还要多出一个状态。

    综上,校验位数k和海明码数n需满足 2^k^ >= n+1

  • 海明码是如何分布的,为什么是这样分布的?

    海明校验码的k个校验位$k_1,k_2,…k_i,…,k_n$ 的第i位(i = 1, 2, …, n)分别分布在第2^i-1^ 位上。

    这是因为,当k = 3时,有一位校验位传输出错的话,则校验位与数据为进行奇偶校验的结果有3中,001,010,100,如果想要处理这种情况,只要令校验位位于001,010,100的位置就可以了。

  • 海明码如何能指出错误的位置,为什么?

    对于一个三位校验指示码$G_3G_2G_1$ ,

    | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    | —— | —— | —— | —— | —— | —— | —— |
    | k1 | k2 | n1 | k3 | n2 | n3 | n4 |

    G1等于1意味着001,011,111,101,必然有一个出错,因此$G_1=p_1\oplus p_3\oplus p_5\oplus p_7$ 。

    同理,G2等于1意味着010,011,110,111,必有一个出错 ,即$G_2=p_2\oplus p_3\oplus p_6\oplus p_7$

    $G_3=p_4\oplus p_5\oplus p_6\oplus p_7$

    因此当n1出错时,G1=1,G2=1,G3=0,即011B = 3D,可以指出错误的位。

    (参考文献 1 解释得更加详细!)

Reference

[1] 海明校验码是怎么实现的?: https://www.zhihu.com/question/29169628/answer/837787585 (这个讲得很好,循序渐进)