zoukankan      html  css  js  c++  java
  • 二进制中1的个数

    二进制中1的个数

    输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

    sample input:
    10
    sample output:
    2
    

    常规解法:

    十进制转二进制,遍历计算二进制中1的个数。

    int solve(int n){
          int cnt=0;
          while(n){
                if(n%2) cnt++;
                n/=2;      
          }
          return cnt;
    }
    

    这种方法,对于大部分数据是对的,但是对于-2147483648,二进制为1000...000,一共有31个0.因为计算机使用补码存储二进制数据的。对于这个数据,该程序输出0,实际上为1.所以这种方法不对。

    二进制移位法(有问题)

    int solve(int n){
          int cnt = 0;
          while(n){
                if(n&1) cnt++;
                n >>= 1;
          }
          return cnt;
    }
    

    二进制思想:

    对于一个数n和n-1对应二进制中,n的高位向低位最后一个1(低位向高位第一个1),在减1后,这个1变为0,之前的位不变,之后的位0->1,1->0.n&(n-1)按位与后,1前面的不变,后面的全变为0.
    通过按位与我们可以很好地通过循环计算1的个数。而且不用判断0,会在n&(n-1)的过程中自动忽略,不需要按照位来遍历判断。

    int solve(int n){
          int cnt=0;
          while(n){
                cnt++;
                n &=(n-1);
          }
          return cnt;
    }
    T(时间复杂度):O(n)
    S(空间复杂度):O(1)
    
    流转星云
  • 相关阅读:
    判断两个对象是否相同
    参数的修饰符
    异常处理
    类型转换
    值类型和引用类型
    抽象方法实现计算器
    静态
    多态
    访问修饰符
    面向对象三大特性
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/14367874.html
Copyright © 2011-2022 走看看