問題: 輸入一個整數,求其二進制中1的個數
看到這個問題,我們應該想到數的位運算:
解法一:我們每次將此數&1 ,如果結果等於1,證明此數的最后一位是1,,count++; 然后在將數右移一位,
循環下去,直到此數==0,即可統計出其中1的個數
Test1:
1 private static int getNum1(int i) { 2 int count=0; 3 while (i!=0){ 4 if((i&1)==1){ 5 count++; 6 } 7 i= i>>1; 8 } 9 return count; 10
缺點:這種情況只能適用於正整數,當為負數時,負數循環右移時是用1來填前面空缺的位置,所以永遠都不會等於0,陷入死循環
解法二:我們的分析就是:把一個整數減去1。再和原整數做與運算,會把該整數最右邊的一個1變成0.那么一個整數的二進制表示中有多少個1,就能夠進行多少次運算。
基於這種思路。我們能夠寫出這種代碼:
Test2:
private static int getNum1(int i) { int count=0; while (i!=0){ i=i&(i-1); count++; } return count; }
這樣操作,無論數是正還是負都可以完美求出1的個數
解法三:我們調用Integer的方法,將i的二進制轉為字符串,再依次遍歷其中1的個數,也可以完美解決。
Test3:
private static int getNum1(int i) { int count=0; String str=Integer.toBinaryString(i); for (int j = 0; j <str.length() ; j++) { if(str.charAt(j)=='1'){ count++; } } return count; }