汉明码是一种数据传输中校验和纠错的手段。当传输一个二进制码时,它在每一个2的整数次幂位插入校验位,如1、2、4、8…如下图所示,其中P为校验码,D为数据:
位数二进制分别为:
P1: 第1位 001;P2 第2位 010;D1 第3位 011;P3 第4位 100;D2 第5位 101; D3 第6位 110;
其中P1在第一位,二进制001,与二进制编码最后一位为1的位数的数据相异或,即D1和D2
P1=D1⊕D2
P2在第二位,二进制10,与二进制编码倒数第二位为1的位数的数据相异或,即D1 D3
P2=D1⊕D3
P3在第三位,二进制100,与二进制编码倒数第三位为1的位数的数据相异或,即D2 D3
P3=D2⊕D3
假如我们想要传输的数据为0110001100110101,你可能会说用4位校验码就能表示完全表示这个16位数,毕竟24=16,那你就忽略了这三位校验码本身,校验码插入后如下:
如上图:
P0= 异或(0 1 0 0 1 0 1 1 1 1)=0;
P1=异或(0 1 0 0 1 0 1 0 1)=0;
P2=异或(1 1 0 1 0 0 1 0 1)=1;
P3=异或(0 0 1 1 0 0 1)=1;
P4=异或(1 0 1 0 1)=1.
若传输后第11位因噪声翻转为0,则
传输数据为:010011010011001110101;
接收数据为:010011010001001110101;
将校验位与对应的数据位相异或,即可得出错误位,如下:
P4=异或(P4 1 0 1 0 1)=0
P3=异或(P3 0 0 0 1 0 0 1)=1(即异或的数据位有错误,或者说,错误的数据位的倒数第四位为1)
P2=异或(P2 1 1 0 1 0 0 1 0 1)=0
P1=异或(P1 0 1 0 0 0 0 1 0 1)=1(即错误的数据位的倒数第二位为1)
P0=异或(P0 0 1 0 0 0 0 1 1 1 1)=1(即错误的数据位的倒数第一位为1) 得出错误位为:01011,即11.