在8位数据d(D7~D0 )中,他的算法如下。
D ^=D 4;
D ^=D 2;
D ^=D 1;
D=1;
最后d是偶检查的值。
可能有些同学一时还不知道算法的原理,在这里说明一下吧。
首先,在d中查找两个位D1和D0。 并且D1D0的偶数检验值E0=D1^D0。 这个大家都知道。 并且还有D3和D2的检验值E1=D3^D2,同样也有E2=D5^D4和E3=D7^D6。
在E0=1的情况下,表示在D1和D0中有奇数个1,E1、E2和E3也同样;
然后复习一下小学的数学吧。 奇数*奇数=奇数,偶数*奇数=偶数
如果E0和E1中有奇数个1,则D3~D0中有奇数个1,此时D3~D0偶数检验值为1;
“如果E0和E1中有奇数个1的话”这句话的意思不是求E1和E0组成的二进制数的偶检吗? 此外,当E1E0的偶检测值F0=1时,对应的D3~D0的偶检测值也为1。
同样,在E3E2的偶检测值F1=1的情况下,对应的D7~D4的偶检测值也为1;
类似地,如果由F1和F0构成的2位二进制偶检测G0=1,则对应的是E3~E0的偶检测值为1,同时对应的D7~D0的偶检测值为1。
于是,求出D7~D0的偶检测值,就是求出F1F0的偶检测值。
首先,将D7~D0的8比特按2分组后,分别求出异或,接着,将得到的值的4比特按2分组求出异或,对最后得到的值的2比特进行异或,得到的值为D7~D0的偶数校验值
分组化不一定必须相邻,将d向右偏移4位,取得与原d的异或就很简单了
D7——D3
D6——D2
D5——D1
D4——D0
这样,每次向右移位后与原始值进行异或时,最终都会得到d的检查值。 另外,在计算过程中,只需关注后面的位数即可。 像第二次计算一样,前4位有一些数据,最后7位也有数据,但这些数据已经没用了,请最后来一个。
因此,文章开头的8位二进制数的算法如下。
D ^=D 4;
D ^=D 2;
D ^=D 1;
D=1;
另外,对于2^N位的二进制数,在第1次右移(2^N )/2位后取异或,重复n次同样的计算即可。