劍指offer-10 二進制數字1的個數

輸入一個int型數字,輸出它作爲二進制的1的個數。如9的二進制爲1001,有2個1,則輸出2。

法一:因爲int型有4個字節,一共32位,每次將輸入右移1,並和1進行“與”操作。將結果累加,則爲1的個數。

public class Test10{
    public static int numberofone(int n){
        int result = 0;
        for (int i =0;i<32;i++){
            result += (n & 1);
            n >>>=1;//不是循環右移,而是直接去掉最後一位的右移
        }
        return result;

    }
    public static void main(String[] args) {
        System.out.println(numberofone(0B11110000_1000011));//輸出爲7
    }
}

法二:有個神奇的結論。一個二進制數字減一,在和自己“與”操作。就可以把最後的一個1變爲0。如10100&10011=10000。

下面爲方法體

public static int numberOfOne2(int n) {
        // 記錄數字中1的位數
        int result = 0;
//         數字的二進制表示中有多少個1就進行多少次操作
        while (n != 0) {
            result++;
            // 從最右邊的1開始,每一次操作都使n的最右的一個1變成了0,
            // 即使是符號位也會進行操作。
            n = (n - 1) & n;
        }
//         返回求得的結果
        return result;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章