1. 程式人生 > >int a 判斷a是否是2的n次冪(a 是一個正整數)

int a 判斷a是否是2的n次冪(a 是一個正整數)

此處想到三種方法實現

方法一:

2的n次冪,2^0->1,2^1->2 ,2^2(2 * 2)->4,2^3(2 * 2 * 2)->8,2^4(2 * 2 * 2*2)->16 .....

因此可以將傳入的值不斷和n * 2 做對比,只要相等就為2^n

public static boolean f3(int a) {
		boolean b = false;  
	    int x = 2;  
	    while(true){  
	        if(a == 1 || x == a){  
	            b = true;  
	            break;  
	        }if(x < a){  
	            x = 2 * x;  
	        }else{  
	            b = false;  
	            break;  
	        }  
	    }  
	    return b;
	}

方法二:

將2^n轉換成二進位制

2^0->1->1,2^1->2 ->10,2^2->4->100,2^3->8->1000,2^4->16->10000

因此可以將值轉換成二進位制字串,判斷第二個數字以後都是0即表示是2^n,需要注意2^0,因此一開始可以將boolean設定為true

public static boolean f3(int a) {
		
		boolean b = true;
		String s = Integer.toBinaryString(a);
		byte[] bytes = s.getBytes();
		
		for (int i = 1; i < bytes.length; i++) {
			if (bytes[i] != 48) {
				b = false;
				break;
			}
		}
		
		return b;
	}

方法三:

通過運算來實現

轉換成二進位制

2^0->1->1,2^1->2 ->10,2^2->4->100,2^3->8->1000,2^4->16->10000

此時如果使用

1 & 0 = 0

2 (10) & 1 (1) = 0

3(11) & 2(10) != 0

4(100) & 3 (11) = 0

5(101)& 4(100) !=0

6(110) & 5(101) !=0

7(111)& 6 (110) != 0

8(1000) & 7(111) = 0

因此 可以使用(n &  (n - 1))計算

public static boolean f2(int a) {
	return (a > 0) && (a & (a - 1)) == 0;
}