給定一個整數,編寫函數判斷其是否為 2 的冪次方(即 2^k, k ≥ 0)。
核心性質:2 的冪次方在二進制中只有最高位為 1,其餘為 0(如 8 = 1000₂)。n-1 則是最高位變 0,其餘變 1(7 = 0111₂)。因此 n & (n-1) == 0 可判斷是否為 2 的冪次方。
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return (n & (n - 1)) == 0;
}
};
不斷除以 2,若過程中出現餘數非 0 且商不為 1,則非 2 的冪次方。
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
while (n > 1) {
if (n % 2 != 0) return false;
n /= 2;
}
return true;
}
};
32 位有號整數最大的 2 的冪次方為 2^30 = 1073741824。若 n > 0 且 1073741824 % n == 0,則 n 為 2 的冪次方。
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && 1073741824 % n == 0;
}
};
| 方法 | 時間複雜度 | 空間複雜度 | 優缺點 |
|---|---|---|---|
| 位運算 | O(1) | O(1) | 最快、最優雅 |
| 迭代 | O(log n) | O(1) | 直觀易懂 |
| 數學取模 | O(1) | O(1) | 利用整數範圍上限 |

1 (2^0) → true16 (2^4) → true3 → false0 → false-16 → false