【问题标题】:Understanding parity of a number了解数字的奇偶性
【发布时间】:2015-07-09 19:51:07
【问题描述】:

我正在阅读“编程面试要素”,第一个问题是关于计算数字的奇偶性(二进制表示中 1 的数量是偶数还是奇数)。提供的最终解决方案是:

short Parity(unsigned long x) {
  x ^= x >> 32;
  x ^= x >> 16;
  x ^= x >> 8;
  x ^= x >> 4;
  x &= 0xf;
  ...

我知道,使用 x 的最终值,您可以在查找表 = 0x6996 中查找答案。但我的问题是为什么上面的代码有效?我手工制作了一个 16 位示例,它确实给出了正确的奇偶校验,我只是在概念上不理解它。

【问题讨论】:

    标签: algorithm binary


    【解决方案1】:

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

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

    现在,这对我们来说可以继续进行。

    【讨论】:

      【解决方案2】:

      之所以有效,是因为,

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

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

      【讨论】:

        【解决方案3】:

        对于 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 次方) = x 的 4 位 = 1010(偶校验)

        经过2次迭代

                  10111010
        
                  00101110
                ___________
        
              x = 10010100
        

        最右边的 8/(2 的 2 次方) = x 的 2 位 = 00(偶校验)

        经过3次迭代

                        10010100
        
                        01001010
                      ___________
                    x = 11011110
        

        最右边的 8/(2 的 3 次方) = x 的 1 位 = 0(偶校验)


        现在我们可以通过 ANDING 来提取数字 b 的任何第 d 位数字 数字 q,其中只有第 d 位是 1(一),其他所有位都是 0(零)。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-22
          • 2019-12-24
          • 2016-04-21
          • 2011-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多