zoukankan      html  css  js  c++  java
  • 常见算法之4---正整数二进制表示中的1的个数

    题目:输出一个正整数的二进制中1的个数。

    示例:10(二进制为1010),则输出2

    方案一:

    基本思想:使用除法,不断除以2,记录余数为1时的次数。

    代码:

    while(i!=0){
         if(i%2!=0)
             num++;
         i = i/2;
     }

     

    方案二:

    基本思想:使用位运算(效率上高于方案一),通过不断的右移,记录最右位为1的次数。

    代码:

    while(i!=0){
        if((i&1)!=0) //最后一位为1
            num++;
        i = i>>1;
     }

    注意:若输入为负数的时候,会导致死循环。

     

    方案三:

    基本思想:一个数的二进制减去1之后,会发生这样的改变:从最右边的1开始到最后,所有位都会变反,而其他的位不变。将两者进行&运算后,从原来最右边的1开始就都变成了0。那么,有多少个1,就有多少次这样的运算。

    例:(以下都是二进制表示)

    1100-1=1011,1100&1011=1000

    1000-1=0111,  1000&0111=0000 

    一共进行了两次这样的运算(原始数中有两个1)

    代码:

    while(i!=0){
        num++;
        i =i&(i-1);
     }

     

    扩展:如何判断一个数是2的正次幂?

    通过上面,我们发现,2的正次幂的二进制表示中只有一个1。

    那么若n&(n-1)为0,则n就是2的正次幂。

  • 相关阅读:
    微信、陌陌等著名IM软件设计架构详解
    腾讯首度公开S级手游品质管理方法
    input(file)按钮美化
    巧用css提高浏览器兼容性
    开博首记
    接口测试
    列表、元组操作
    Cacti应用
    Cacti修改采集精度为1分钟
    Centos Cacti 0.8.8g
  • 原文地址:https://www.cnblogs.com/xiaoChongUp/p/3281022.html
Copyright © 2011-2022 走看看