第一種方法
public class TestJudge2NthPower {
public static void main(String[] args) {
System.out.println(isPowerOf2(-1));//false
System.out.println(isPowerOf2(0));//false
System.out.println(isPowerOf2(1));//true
System.out.println(isPowerOf2(2));//true
System.out.println(isPowerOf2(3));//false
System.out.println(isPowerOf2(10));//false
System.out.println(isPowerOf2(16));//true
System.out.println(isPowerOf2(1 << 30));//true
}
//判斷目標值是否為2的N次冪
private static boolean isPowerOf2(int target) {
if (target <= 0) {
return false;
}
if (target == 1) {
return true;
}
//相當於target%2==0 對2取余,沒有余數
while (target > 2 && (target & 1) != 1) {
//相當於除以2
target >>= 1;
}
return target == 2;
}
}
暴力解法
第二種方法
public class TestJudge2NthPower2 {
public static void main(String[] args) {
System.out.println(isPowerOf2(-1));//false
System.out.println(isPowerOf2(0));//false
System.out.println(isPowerOf2(1));//true
System.out.println(isPowerOf2(2));//true
System.out.println(isPowerOf2(3));//false
System.out.println(isPowerOf2(10));//false
System.out.println(isPowerOf2(16));//true
System.out.println(isPowerOf2(1 << 30));//true
}
//判斷目標值是否為2的N次冪
private static boolean isPowerOf2(int target) {
if (target <= 0) {
return false;
}
return (target & (target - 1)) == 0;
}
}
示例分析
以16為例,二進制表示為
00000000 00000000 00000000 00010000
16減1為15的二進制表示為
00000000 00000000 00000000 00001111
兩者按位與
00000000 00000000 00000000 00000000
十進制表示為0,說明是2的N次冪。
擴展-判斷一個數是否是n的N次冪
public class TestJudgeNNthPower {
public static void main(String[] args) {
System.out.println(isPowerOfN(-1, 3));//false
System.out.println(isPowerOfN(0, 3));//false
System.out.println(isPowerOfN(1, 3));//true
System.out.println(isPowerOfN(2, 3));//false
System.out.println(isPowerOfN(3, 3));//true
System.out.println(isPowerOfN(10, 3));//false
System.out.println(isPowerOfN(27, 3));//true
System.out.println(isPowerOfN((int) Math.pow(4, 10), 4));//true
System.out.println(isPowerOfN(1024, 8));//false
}
//判斷目標值是否為n的N次冪
private static boolean isPowerOfN(int target, int n) {
if (target <= 0) {
return false;
}
if (target == 1) {
return true;
}
while (target > n && (target % n) == 0) {
target /= n;
}
return target == n;
}
}