int a 判斷a是否是2的n次冪(a 是一個正整數)
阿新 • • 發佈:2018-12-25
此處想到三種方法實現
方法一:
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; }