題目描述
輸入一個整數,輸出該數二進制表示中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);
}
}