題目一:請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。如9的二進制表示為1001,有2位是1.
實例代碼:
import java.util.Scanner;
public class 二進制中1的個數 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println(Integer.toString(N,2)); // 輸出二進制數
//解法一
int count = 0;
// 比對每一位
for (int i = 0; i < 32; i++) {
if ((N&(1<<i))==(1<<i)) {
count++;
}
}
System.out.println(count);
//解法二
count = 0;
for (int i = 0; i < 32; i++) {
if (((N>>>i)&1)==1) { // >>> 運算符用 0 填充高位;>> 運算符用符號位填充高位,沒有<<<運算符
count++;
}
}
System.out.println(count);
//解法三 把一個整數n減去1,再和原來的整數與運算,會把該整數的最右邊的1變成0,
// 那么,一個整數的二進制中有多少個1,就可以進行多少次這樣的操作。循環結束的條件是n為0
count = 0;
while(N!=0){
N = ((N-1)&N);
count++;
}
System.out.println(count);
}
}
運行結果:

題目二:用一條語句判斷一個整數是不是2的整數次方。
思路:一個整數如果是2的整數次方,那么它的二進制表示中有且僅有一個位是1,而其他所有位都是0,根據上面解法三的分析,把這個整數減去1后再與自己相與,唯一的1也會變成0.注意這里不用考慮2的-1次方之類,因為2的-1次方等與0.5,是一個浮點數,與題目不符。
實例代碼:
import java.util.Scanner;
public class Test {
// 異或運算
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println(Integer.toString(N,2));
if (((N-1)&N)==0) { // 關鍵一條語句
System.out.println("True");
}else {
System.out.println("False");
}
}
}
運行結果:

