对于一些数据,当其中发生错误时,我们希望通过算法发现错误并纠正
对于所有二进制位以二级制写出它的位置
0->0000, 1->0001, 2->0010 ...
0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 < 数据
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 < 位置
0 1 2 3 4 5 6 7 .. 15
将第一个末位为一的比特位设为校验位,不存储数据,修改校验码,使得位置数末位为1且数据为1的比特位个数为偶数
以此类推 __1_, _1__, 1___
0001 0010 0100 1000 为校验位
观察任意一个比特位
如 0101
其位于两个组内 _1__ ___1
检验时,将所有为1的位的位置标号进行异或即统计每个组的奇偶性
对于一个组如_1__
如下位数据为1
100,110,1100,1110
为偶数个 所以该组内要么没有错误要么有偶数个错误
仅考虑出现一个错误
异或的结果如为零则没有错误
如不为零则为错误的位
注意到 0 位置不在任何一个组内,无法校验是否出现错误, 所以将0位置设为校验码,使得整个数据中1的个数为偶数
异或运算实际上和依次检查每个组实质上相同,检查每个组的奇偶性容易在硬件上实现,异或在软件实现上非常简洁。
需要注意虽然汉明码可以适应任意大小数据,但其只能检测出一位错误。当数据变大,错误发生的概率变大,很有可能发生多个位的错误。