繁体   English   中英

了解一个数字的平价

[英]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。 这些是实际的两个奇偶校验 - 一个用于原始数字的奇数位,一个用于原始数字的偶数位。 对两个奇偶校验进行异或,我们得到原始奇偶校验。

现在,这对我们来说依旧不断。

它有效,因为,

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

这给出了一个递归算法,通过将每个字符串分割到中间,直到它是一个基本情况,然后你可以逐层分组并翻转以获得问题中显示的代码..排序,因为它提前结束并且显然是最后一步是查找。

对于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM