題目來源於 LeetCode 上第 342 號問題:4 的冪。題目難度爲 Easy,目前經過率爲 45.3% 。java
給定一個整數 (32 位有符號整數),請編寫一個函數來判斷它是不是 4 的冪次方。函數
示例 1:spa
輸入: 16 輸出: true
示例 2:3d
輸入: 5 輸出: false
進階:
你能不使用循環或者遞歸來完成本題嗎?code
這道題最直接的方法就是不停的去除以 4 ,看最終結果是否爲 1 ,參見代碼以下:blog
class Solution { public boolean isPowerOfFour(int num) { while ( (num != 0) && (num % 4 == 0)) { num /= 4; } return num == 1; } }
不過這段代碼使用了 循環 ,逼格不夠高。遞歸
對於一個整數而言,若是這個數是 4 的冪次方,那它一定也是 2 的冪次方。圖片
咱們先將 2 的冪次方列出來找一下其中哪些數是 4 的冪次方。rem
十進制 | 二進制 |
---|---|
2 | 10 |
4 | 100 (1 在第 3 位) |
8 | 1000 |
16 | 10000(1 在第 5 位) |
32 | 100000 |
64 | 1000000(1 在第 7 位) |
128 | 10000000 |
256 | 100000000(1 在第 9 位) |
512 | 1000000000 |
1024 | 10000000000(1 在第 11 位) |
找一下規律: 4 的冪次方的數的二進制表示 1 的位置都是在奇數位。it
以前在小吳的文章中判斷一個是是不是 2 的冪次方數使用的是位運算 n & ( n - 1 )
。一樣的,這裏依舊能夠使用位運算:將這個數與特殊的數作位運算。
這個特殊的數有以下特色:
符合這兩個條件的二進制數是:
1010101010101010101010101010101
若是用一個 4 的冪次方數和它作與運算,獲得的仍是 4 的冪次方數。
將這個二進制數轉換成 16 進製表示:0x55555555 。有沒有感受逼格更高點。。。
class Solution { public boolean isPowerOfFour(int num) { if (num <= 0) return false; //先判斷是不是 2 的冪 if ((num & num - 1) != 0) return false; //若是與運算以後是自己則是 4 的冪 if ((num & 0x55555555) == num) return true; return false; } }