1. 程式人生 > >二進位制中1的個數(牛客網(六))

二進位制中1的個數(牛客網(六))

輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

public class Solution {
    public int NumberOf1(int n) {
        int count=0;
        while(n!=0)
        {
            if((n&1)==1)
                count++;
            n=n>>1;                 
        }
        
        return count;

    }
}

首先想到的是沒有考慮負數的情況。
負數右移高位補1,正數右移高位補0;負數、正數左移低位補0。當函式輸入的是負數時,如果一直右移,就會進入死迴圈。
為了避免死迴圈,我們可以不右移輸入的數字n,首先把n和1做與運算,判斷n的最低位是不是1,接著把1左移以為得到2,再和n做與運算,就能
判斷其中一位是不是1.
public class Solution {
    public int NumberOf1(int n) {
        int count=0;
        int flag=1;   
        while(flag!=0)
        {
            if((n&flag)!=0)
                count++;
            flag=flag<<1;
        }
      return count;
    }
}
此時,這種解法中迴圈的次數等於整數二進位制的位數。
把一個整數減去1,再和原來的整數做與運算,會把該整數最右邊一個1變成0,那麼一個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。
public class Solution {
    public int NumberOf1(int n) {
        int count=0;
        while(n!=0)
        {
          count++;
          n=n&(n-1);              
        }
        return count;
    }
}