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

    问题描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    思路:

      解法1:把n与1做与运算,判断n的最低位是不是1;接着把1左移1位,然后跟n做与运算,判断n的次低位是不是1;...;反复左移,每次都能判断n的其中一位是不是1.

      解法2:如果一个整数不为0,则该整数至少有一位是1。如果把这个整数减1,那么整数最右边的1会变成0,如果整数最右边1后还有0,那么最右边的1变成0,其后的0均变成1,该位左边的数不变。然后将n-1和n做与运算,最右边的1位处及其后所有位都将变为0,其前所有位不变。那么一个数有多少个1,就可以进行多少次这样的操作。

      例:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.

    代码:

    public class Solution{
        //算法1
      public int NumberOf1(int n){
        int count = 0;
        int flag = 1;
        while(n!=0){
          if((n&flag)!=0)
            count++;
          flag=flag<<1;
         }
       return count;
      }  
        //算法2
      public int NumberOf2(int n){
        int count = 0;
        while(n!=0){
          count++;
          n=(n-1)&n;
         }
       return count;
      }  
    }
  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/xiaoxli/p/9455538.html
Copyright © 2011-2022 走看看