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

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值