本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。c++
我的網站:www.cxyxiaowu.comgit
題目來源於 LeetCode 上第 231 號問題:2 的冪。題目難度爲 Easy,目前經過率爲 45.6% 。github
給定一個整數,編寫一個函數來判斷它是不是 2 的冪次方。算法
示例 1:bash
輸入: 1
輸出: true
解釋: 2^0 = 1
複製代碼
示例 2:函數
輸入: 16
輸出: true
解釋: 2^4 = 16
複製代碼
示例 3:網站
輸入: 218
輸出: false
複製代碼
首先,先來分析一下 2 的次方數的二進制寫法:spa
仔細觀察,能夠看出 2 的次方數都只有一個 1 ,剩下的都是 0 。根據這個特色,只須要每次判斷最低位是否爲 1 ,而後向右移位,最後統計 1 的個數便可判斷是不是 2 的次方數。code
代碼很簡單:cdn
class Solution {
public:
bool isPowerOfTwo(int n) {
int cnt = 0;
while (n > 0) {
cnt += (n & 1);
n >>= 1;
}
return cnt == 1;
}
};
複製代碼
該題還有一種巧妙的解法。再觀察上面的表格,若是一個數是 2 的次方數的話,那麼它的二進數必然是最高位爲1,其它都爲 0 ,那麼若是此時咱們減 1 的話,則最高位會降一位,其他爲 0 的位如今都爲變爲 1,那麼咱們把兩數相與,就會獲得 0。
好比 2 的 3 次方爲 8,二進制位 1000 ,那麼 8 - 1 = 7
,其中 7 的二進制位 0111。
利用這個性質,只需一行代碼就能夠搞定。
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > 0) && (!(n & (n - 1)));
}
};
複製代碼