11_二進制中1的個數

題目描述

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

 

package BitOperate;

/*
題目描述
輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。
 */
public class NumberOf1_11 {
    //方法1:暴力解法
    public int NumberOf1(int n) {
        //把一個10進制數轉爲32位的2進制數。同時對負數,會用補碼錶示
        String s = Integer.toBinaryString(n);
        String[] split = s.split("");
        int a = 0;
        for (int i = 0; i < split.length; i++) {
            if (split[i].equals("1")) {
                a++;
            }
        }
        return a;
    }

    //方法2:常規解法
    // 數字n和1做與運算,判斷n的最低位是不是1。
    // 接着把1左移一位得到2,再和n做與運算,就能判斷n的次低位是不是1
    // 反覆左移,每次都能判斷n的其中一位是不是1,從而計算1的個數
    public int NumberOf2(int n) {
        int num = 0, flag = 1;
        while (flag != 0) {
            if ((n & flag) != 0) {
                num++;
            }
            flag <<= 1;
        }
        return num;
    }

    // 方法3:最優解法
    // 把一個整數減1,再和原整數做與運算,會把該整數最右邊一個1變爲0
    // 一個整數的二進制有多少個1,就可以進行多少次這樣的操作
    public int NumberOf3(int n) {
        int num = 0;
        while (n != 0){
            num++;
            n = n & (n-1);
        }
        return num;
    }

    public static void main(String[] args) {
        NumberOf1_11 number = new NumberOf1_11();
        int num = number.NumberOf2(100);
        System.out.println(num);
    }
}

 

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