[英]Understanding parity of a number
我正在阅读“编程访谈元素”,第一个问题是关于计算数字的奇偶性(二进制表示中的1的数量是偶数还是奇数)。 提供的最终解决方案是这样的:
short Parity(unsigned long x) {
x ^= x >> 32;
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x &= 0xf;
...
我理解,使用x的最终值,您可以在查找表= 0x6996
查找答案。 但我的问题是为什么上面的代码有效? 我手工制作了一个16位的例子,它确实提供了正确的奇偶校验,我只是在概念上不理解它。
查找表令人困惑。 让我们放弃并继续前进:
...
x ^= x >> 2;
x ^= x >> 1;
p = x&1;
为了解决这个问题,让我们从1位案例开始。 在1位情况下,p = x,因此如果x为1,则奇偶校验为奇数,如果x为0,则奇偶校验为偶数。 不重要的。
现在两位的情况。 你看看b0 ^ b1(位0 XOR位1),那就是奇偶校验。 如果它们相等,则奇偶校验是均匀的,否则它是奇怪的。 也很简单。
现在让我们添加更多位。 在四位示例中 - b3 b2 b1 b0,我们计算x ^ (x>>2)
,它给出了两位数:b3 ^ b1 b2 ^ b0。 这些是实际的两个奇偶校验 - 一个用于原始数字的奇数位,一个用于原始数字的偶数位。 对两个奇偶校验进行异或,我们得到原始奇偶校验。
现在,这对我们来说依旧不断。
它有效,因为,
这给出了一个递归算法,通过将每个字符串分割到中间,直到它是一个基本情况,然后你可以逐层分组并翻转以获得问题中显示的代码..排序,因为它提前结束并且显然是最后一步是查找。
对于n位数x,在z次迭代之后,答案始终位于x的最右边n /(2到幂z)位。 让我们举一个例子,其中n = 8且x = 10110001(b7,b6,b5,b4,b3,b2,b1,b0)。
它的实际/正确答案是even_parity 。
经过1次迭代
10110001
00001011
___________
x = 10111010
最右边8 /(2到功率1)= 4位x = 1010( 偶校验 )
经过2次迭代
10111010
00101110
___________
x = 10010100
最右边8 /(2到2)= x = 00( 偶数奇偶校验 )的2位数
经过3次迭代
10010100
01001010
___________
x = 11011110
最右边8 /(2到3)= x = 0( 偶数奇偶校验 )的1位数
现在我们可以通过ANDING它来提取数字b的任何第d个数字,其中数字q只有第d个数字是1(一个)而所有其他数字是0(零)。
这里我们要提取x的最终值的(第0位)/(最右边的数字)。
所以,让它和它(即,(final_value_of_x
(i.e, 11011110)
)
after (
2 to the power(
log n to the base 2
)
) iterations
) with 00000001 to get the answer.
11011110
00000001
_________________
00000000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.