輸入一個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;
}