劍指offer-二進制中1的個數

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

常規思路:每次將整數右移一位,而後使用位與運算&1,可是該方法只適用於正數。spa

public class Solution {
    public int NumberOf1(int n) {
        int ans = 0; //記錄1的個數
        while(n != 0){
            if((n & 1) == 1)
                ans++;
            n = n >> 1;
        }
        return ans;
    }
}

若是傳入的參數爲負數則會陷入死循環,好比0x80000000,當把負數右移一位時,高位會補1,最終變爲0xFFFFFFFF,程序爲陷入死循環。code

 

解決方案:blog

若是傳入參數爲負數,咱們能夠不移動傳入參數,而是移動值爲1的flag變量,該方法每次須要移動32位。時間複雜度O(N)。io

public class Solution {
    public int NumberOf1(int n) {
        int ans = 0;
        int flag = 1;
        while(flag != 0){
            if((n & flag) != 0)
                ans++;
            flag = flag << 1; //每次向左移動flag的值,從右往左與n的每一位作位與運算
        }
        return ans;
    }
}

 

最優解:n二進制中有幾個1,就遍歷幾回的。class

public class Solution {
    public int NumberOf1(int n) {
        int ans = 0; //記錄1的個數
        while(n != 0){
            n = n & (n - 1); //好比1000,1000 & (1000 - 1) = 0,全部就只有一個1
            ans++;
        }
        return ans;
    }
}
相關文章
相關標籤/搜索