位于twiddling网站的问题

时间:2010-07-08 10:42:00

标签: bit-manipulation code-analysis

以下是代码:

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

2 个答案:

答案 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)。

这意味着如果1v中存在0x6996,则计算的奇偶校验位为1,否则为0 - 例如,如果在第5行{{ 1}}计算为2然后返回`,如果它是3则返回0。