Algorithm 理解一个数的奇偶性

Algorithm 理解一个数的奇偶性,algorithm,binary,Algorithm,Binary,我正在学习“编程访谈的要素”,第一个问题是关于计算一个数字的奇偶性(二进制表示中的1的数字是偶数还是奇数)。提供的最终解决方案实现了以下功能: short Parity(unsigned long x) { x ^= x >> 32; x ^= x >> 16; x ^= x >> 8; x ^= x >> 4; x &= 0xf; ... 我知道,使用最终值x,您可以在查找表中查找答案=0x6996。但我的问题是

我正在学习“编程访谈的要素”,第一个问题是关于计算一个数字的奇偶性(二进制表示中的1的数字是偶数还是奇数)。提供的最终解决方案实现了以下功能:

short Parity(unsigned long x) {
  x ^= x >> 32;
  x ^= x >> 16;
  x ^= x >> 8;
  x ^= x >> 4;
  x &= 0xf;
  ...
我知道,使用最终值x,您可以在查找表中查找答案=
0x6996
。但我的问题是,为什么上面的代码可以工作?我手工制作了一个16位的例子,它确实给出了正确的奇偶校验,我只是在概念上不理解它。

它之所以有效,是因为

  • 单个位的奇偶校验本身(基本情况)
  • 位串x和y的级联奇偶性是x奇偶性和y奇偶性的异或

这提供了一个递归算法,将每个字符串从中间向下拆分,直到它成为一个基本情况,然后您可以按层分组并倒置,以获得问题中显示的代码。。有点像,因为它很早就结束了,而且显然是通过查找完成最后一步。

查找表令人困惑。让我们放下它,继续前进:

...
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)

它的实际/正确答案是偶校验

1次迭代后

                10110001

                00001011
              ___________
            x = 10111010
最右边的8/(2为1的幂)=x=1010的4位(偶数奇偶校验)

经过2次迭代后

          10111010

          00101110
        ___________

      x = 10010100
                10010100

                01001010
              ___________
            x = 11011110
最右边的8/(2到2的幂)=x=00的2位(偶数奇偶校验)

经过3次迭代后

          10111010

          00101110
        ___________

      x = 10010100
                10010100

                01001010
              ___________
            x = 11011110
最右边的8/(2为3的幂)=x=0的1位(偶数奇偶校验)


现在,我们可以通过将数字b的任何dth数字与a进行ANDING来提取它 数字q,其中只有dth数字为1(一),所有其他数字为0(零)

这里我们要提取x的最终值的(第0位)/(最右边的位)

所以让我们它(即,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