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的正次幂。

  • 相关阅读:
    好记性不如烂笔头-linux学习笔记2kickstart自动化安装和cacti
    好记性不如烂笔头-linux学习笔记1
    关于TP5中的依赖注入和容器和facade
    vbs 脚本2
    vbs脚本
    Memcache 和 Radis 比较
    MongoDB 索引的使用, 管理 和优化
    mysql大数据高并发处理
    sql处理高并发
    LB 负载均衡的层次结构
  • 原文地址:https://www.cnblogs.com/xiaoChongUp/p/3281022.html
Copyright © 2011-2022 走看看