zoukankan      html  css  js  c++  java
  • 当x含有偶数个1,返回1,否则为0。

    题目描述:

    /* Return 1 when x contains an even number of 1s;0 otherwise. Assume W=32 */

    int even_ones(unsigned x);

    函数应该遵循位级整数编码规则,不过你可以假设数据类型int 有w=32位。

    你的代码最多只能包含12个算术运算、位运算和逻辑运算。

    代码如下:

    1 int even_ones(unsigned x)
    2 {
    3   x = x ^ (x >> 1);
    4   x = x ^ (x >> 2);
    5   x = x ^ (x >> 4);
    6   x = x ^ (x >> 8);
    7   x = x ^ (x >> 16);
    8   return !(x & 1);   
    9 }

    代码分析:

    我们首先用一个具体的数据来测试这段代码,比如我们用444164这个数字,444164的二进制为1101100011100000100.

    第一次异或操作:

    00000000000001101100011100000100

    ^

    00000000000000110110001110000010

    =

    00000000000001011010010010000110

    关于得出的这个结果,我们认为右起的第i位,表示原数第i位和第i+1位中包含1的奇偶情况。比如右起第0位为0,则原数第0和第1位包含1的个数为偶;而右起第1位为1,则原数第1位和第2位包含1的个数为奇。。。

    为什么可以得出这个结论呢?x >> 1,我们假设这个数为x',而x'的第i位数实际上就是x的第i+1位,所以x ^ x',实际就是x的第i位与第i+1位异或,而异或的定义为相同为0,不同为1,所以如果这两位都为1或都为0,包含偶数个1,则结果为0,反之亦然。

    第二次异或操作:

    00000000000001011010010010000110

    ^

    00000000000000010110100100100001

    =

    00000000000001001100010110100111

    关于得出的这个结果,我们认为右起的第i位,表示原数第i位和第i+1,i+2,i+3位中包含1的奇偶情况。为什么能得出这样的结论?我们先看第一次操作的结果,第0位表示原数的第0和第1位的情况,第1位表示原数第1位和第2位的情况,第2位表示原数第2位和第3位的情况。。。我们假设第2次异或操作的数为x2,而x2 >> 2 的结果为 x2',这时,x2'的第0位其实是x2的第2位,所以x2 ^ x2' 实际上是x2的第i位和第i+2位的异或,而我们前面提到 第0位表示原数的第0和第1位的情况,第2位表示原数第2位和第3位的情况,所以第二次操作得出的结果的第i位是 x2的第i位和第i+2位的异或,即表示原数第i位和第i+1,i+2,i+3位中包含1的奇偶情况。

    剩下的几次异或操作分析很上面类似。。。

    整个操作的形式化表示如下:

    1.x ^ (x >> 1)

    x:   

    x >> 1:

    x ^ (x >> 1):

    2.x ^ (x >> 2)

    x:  

    x >> 2:

    x ^ (x >> 2):

    3.x ^ (x >> 4)

    x:  

    x >> 4:

    x ^ (x >> 4):

    4.x ^ (x >> 8)

    x:  

    x >> 8:

    x ^ (x >> 8):

    5.x ^ (x >> 16)

    x:  

    x >> 16:

    x ^ (x >> 16):

    参考博客:http://www.matrix67.com/blog/archives/264 

  • 相关阅读:
    java基础数据
    Java环境搭建
    Mysql数据库基础
    php环境搭建
    1117bootstrap组件
    1117bootstrap
    1115表单验证
    1114JS实例4
    1113JS实例3
    1111JS实例2
  • 原文地址:https://www.cnblogs.com/linxiaotao/p/3405393.html
Copyright © 2011-2022 走看看