題目描述
輸入一個整數(shù),輸出該數(shù)二進(jìn)制表示中1的個數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
/**
* Created by ZengXihong 2019-06-05.
* #題目描述
>輸入一個整數(shù),輸出該數(shù)二進(jìn)制表示中1的個數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
*/
public class Solution11 {
public static int NumberOf1_1(int n) {
//采用 Integer 類方法
return Integer.bitCount(n);
}
public static int NumberOf1_2(int n) {
/**
* 假設(shè) n 的二進(jìn)制表示為 100001000
* 則 n-1 的二進(jìn)制表示為 100000111
* n & (n-1) 100000000 計(jì)數(shù)加1,下一個1 為倒數(shù)第 9 位
* 原理:
* 1. 將一個數(shù)字表示為二進(jìn)制
* 2. 從右往左數(shù) 1 的個數(shù)
* 3. 將 n 減去 1 后,從右往左的第一個 1 ,其位變?yōu)?,且該位 左邊不變,右邊全為 1
* 4. 將 n 和 n-1 進(jìn)行 與 計(jì)算。則得到,該值 左側(cè)依舊不變,該位以及后邊 均為 0
* 5. 下一位則是原數(shù) n 從右往左的第二個1,也即為【與運(yùn)算】的結(jié)果從右往左的 第一個 1 (和第 2 步循環(huán))
* 6. 當(dāng)最后為 0 時,則退出循環(huán)
*/
int count =0;
while (n!=0){
++count;
n = n & (n-1);
}
return count;
}
public static void main(String[] args) {
System.out.println(NumberOf1_1(10));
System.out.println(NumberOf1_2(10));
}
}