算法来源:互联网
功能描述::
大家都知道,信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。
算法思路:
总体就是把信息的所有为1的比特位集中起来,看看到底是有奇数个还是偶数个。我们可以通过“逻辑右移”和“异或”运算来实现。
例如,我们可以把信息用二进制的方式表示出来,A=(an … a1a0)2
1、初始化,设置辅助变量 s , 令 s = n, s = s / 2;
2、 A = A ^(A >> s)。
3、如果 s = 1 ,求 A & 1 ,结束算法;否则,s = s/2 , 继续第二步。
unsigned parity(unsigned arg)
{
unsigned a = arg;
a ^= a >> 16;
a ^= a >> 8;
a ^= a >> 4;
a ^= a >> 2;
a ^= a >> 1;
return a & 1;
}