判斷一個整數是否爲2的整數次冪
:
很容易想到的暴力破解方式,就是 從1開始乘2,不斷乘,如果恰好能夠等於這個要判斷的數,那麼就找到解,否則無解
/**
* 暴力枚舉
* @param num
* @return
*/
public static boolean isPowerOf2(int num) {
int i = 1;
while(i <= num) {
if(i == num) {
return true;
}
i <<= 1;
}
return false;
}
再思考一下2的整數次冪有什麼特點?
// 看一看2^10 = 1024的二進制表示有什麼特點:
int num = 0B10000000000;
int numSubOne = num - 1;
// 我們再看看num與num-1的二進制有什麼特點:
System.out.printf("%s%n", Integer.toBinaryString(num));
System.out.printf("0%s", Integer.toBinaryString(numSubOne));
我們查看輸出:
10000000000
01111111111
可以發現(num & (num-1)) == 0
所以我們能夠實現O(1)時間複雜度的算法:
public static boolean isPowerOf2_1(int num) {
return (num & (num-1)) == 0;
}