题目来源:LeetCode 342: 4的幂
问题抽象: 给定一个整数 n
(32 位有符号整数),判断其是否为 4 的幂(即存在整数 k
使得 4^k = n
)。
-
核心需求:
- 返回布尔值
true
当且仅当n
可表示为4
的整数次幂; - 需处理 正数、零、负数:
- 负数直接判否(因
4^k>0
); - 零判否(
4^k
恒为正)。
- 负数直接判否(因
- 返回布尔值
-
数学条件:
- 必要条件:
n
必须是 正数 且为 2 的幂(即n > 0
且n & (n-1) == 0
); - 充分条件:在满足必要条件的基础上,
n
的唯一二进制位1
必须位于 偶数索引位(最低位索引为0
,如1 (0b1)
的索引为0
,4 (0b100)
的索引为2
)。
- 必要条件:
-
边界处理:
n=1
返回true
(4^0=1
);n=0
或负数返回false
;- 最大
4
的幂在2^31
范围内:4^15 = 1073741824
为有效值,4^16
超出2^31-1
故不在输入范围内。
-
特殊案例验证:
n=16
(4^2=16
)→true
(0b10000
,1
位于索引4
偶数位);n=8
(2^3
)→false
(虽是2
的幂但1
位于索引3
奇数位);n=5
→false
(非2
的幂)。
输入:整数 n
(值域 [-2^31, 2^31-1]
)
输出:布尔值(true
表示 n
是 4
的幂,否则 false
)。
解题思路
要判断一个整数是否为4的幂,需要满足以下条件:
- 必须是正数:4的幂都是正整数(n > 0)。
- 必须是2的幂:4的幂首先是2的幂,满足
(n & (n-1)) == 0
(二进制中只有1个1)。 - 1必须出现在奇数位:4的幂的二进制表示中,1的位置只出现在从低位开始的第1、3、5…等奇数位上。通过掩码
0x55555555
(二进制01010101010101010101010101010101
)检查:(n & 0x55555555) != 0
。
为什么用掩码0x55555555?
该掩码确保n的二进制表示中,1的位置落在奇数位。例如:
- 4¹ = 4 →
100
(第3位,符合) - 4² = 16 →
10000
(第5位,符合) - 非4的幂(如8=1000)在第4位(偶数位),会被掩码过滤。
代码实现(Java版)🔥点击下载源码
class Solution {
public boolean isPowerOfFour(int n) {
// 条件1:n必须大于0(4的幂是正数)
// 条件2:n是2的幂(二进制中只有1个1)
// 条件3:n的二进制中1的位置在奇数位(通过掩码0x55555555验证)
return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
}
}
代码说明
- 时间复杂度:O(1),只有位运算操作。
- 空间复杂度:O(1),未使用额外空间。
- 关键操作:
n > 0
:排除负数和0。(n & (n-1)) == 0
:确保n是2的幂(二进制中仅1个1)。(n & 0x55555555) != 0
:确保1出现在奇数位(掩码设计见解题思路)。
- 优势:位运算直接操作二进制,效率最高,且无循环/递归。