讀書筆記——漫畫算法(5) 判斷一個整數是否爲2的整數次冪

判斷一個整數是否爲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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章