以下是代码:
unsigned int v; // word value to compute the parity of
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
v &= 0xf;
return (0x6996 >> v) & 1;
它计算给定单词v
的奇偶校验。 0x6996是什么意思?
二进制数0x6996是110100110010110
。
答案 0 :(得分:8)
前四行将v
转换为与原始版本具有相同奇偶校验的4位数字(0到15)。 16位数0x6996
包含从0到15的所有数字的奇偶校验,右移用于选择正确的位。它类似于使用查找表:
//This array contains the parity of the numbers 0 to 15
char parities[16] = {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};
return parities[v];
请注意,数组条目与0x6996的位相同。使用(0x6996 >> v) & 1
会得到相同的结果,但不需要内存访问。
答案 1 :(得分:1)
该算法正在通过连续的按位OR将32位int压缩为相同奇偶校验的4位值,然后与0xf
进行AND运算,以便在最不重要的4中只有正位位。换句话说,在第5行之后,v
将是0到15之间的整数。
然后它将该幻数(0x6996
)向右移动此0-16值,并仅返回最低有效位(& 1
)。
这意味着如果1
位v
中存在0x6996
,则计算的奇偶校验位为1,否则为0 - 例如,如果在第5行{{ 1}}计算为2然后返回`,如果它是3则返回0。