題目:輸入一個整數,輸出該數二進制表示中1的個數。
基本思路1(不可行):先判斷整數二進制表示中最右邊的一位是否爲1,接着把整數右移一位,再判斷該位是否爲1.這樣每次移動一位,直至整個整數變成0爲止。
如何判斷一個整數的最右邊一位是否爲1:如果一個整數與1做與運算結果爲1,則整數最右邊一位爲1。
該方法會導致出現死循環。當把一個負數右移一位時,不是簡單的把最高位的1移到第二位,而是最高位繼續補上1.如果一直做右移運算,做種會變成0xFFFFFFFF而陷入死循環。
基本思路2(可行):爲避免死循環,可以選擇不右移輸入的數字,而是把要進行與運算的1不斷左移。
基本思路3(可行):把一個整數的減去1,再和原整數做與運算,會把該整數最右邊的1變成0。那麼一個整數可以進行多少次這樣的運算,就有多少個1。
import java.util.Scanner;
public class NumberOf1 {
//基本思路2
public static int numberOf1_1(int n) {
int count = 0;
int flag = 1;
while(flag!=0){
if((n & flag)!=0)
count++;
flag = flag << 1;
}
return count;
}
//基本思路3
public static int numberOf1_2(int n) {
int count = 0;
while(n!=0){
++count;
n = (n - 1) & n;
}
return count;
}
public static void main(String[] args) {
System.out.print("請輸入一個十進制整數:");
Scanner sc = new Scanner(System.in);
int sc1 = sc.nextInt();
System.out.println("該數的二進制爲:"+Integer.toBinaryString(sc1));
System.out.println("思路1:該數的二進制中包含1的個數爲:"+numberOf1_1(sc1));
System.out.println("思路2:該數的二進制中包含1的個數爲:"+numberOf1_2(sc1));
sc.close();
}
}