題目一:請實現一個函數,輸入一個整數,輸出該數二進制表示中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"); } } }
運行結果: