C语言中的位运算(学习来自剑指offer)

来源:互联网 发布:js 深度复制对象 编辑:程序博客网 时间:2024/05/22 07:53

1.二进制中1的个数

        请实现一个函数,输入一个整数,输出该数的二进制表示中1的个数,

         int NumBerOf1(int n)

        {

int count = 0;

    while(n)

{

if(n&1)

count++;

n = n>>1;

}

return count;

}

讨论上面代码的正确性,移位操作,当对一个正数右移的时候,补充的是0,但是当对一个负数进行移位的时候,从左侧开始补充的是符号位也就是1

当n为正数的时候,代码可以正确得出结果,但是,当输入的n是个负数则n最后可能变成0xFFFFFFFFF,使while陷入死循环。

2.int NumBerOf1(int n)

{

int cont = 0;

     unsigned int flag = 1;

while(flag)

        {

              if(n & flag)

count++;

flag = flag << 1; 

        }

return count;

}

在这个算法中,循环的次数等于n中二进制的位数,二进制位数有几位那么就循环几次,flag逐渐向左移位,测试整数二进制情况下的所有位是否为一。

3.由第二种算法进行分析,是否可以直接只循环1的个数次,即当二进制位为0的时候不去进行循环,只有当当前的二进制位为1 的时候才进行循环,

int NumberOf1(int n)

{

        int count =  0;

        while(n)

        {

++count;

n = (n-1) & n;

  }

}

第三种算法主要运用了二进制转换中的一个知识点,

把一个数减去1与自己本身相与那么二进制形式下最右侧的1变成0

此时进行第三种算法中的while循环的时候,每次都把二进制中的一个1变成0按照这种方式进行递归,最终二进制中1都变成了0.


0 0
原创粉丝点击