位運算-二進制中1的個數(三種解法)


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

  運行結果:

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM