持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
一、题目描述:
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
提示:
- -2^31 <= n <= 2^31 - 1
进阶:你能不使用循环或者递归来完成本题吗?
二、思路分析:
这个题和“2的幂”“3的幂”一样,有不用循环和递归就能直接判断的方法,同样十分巧妙,属于二进制/位运算的应用。
4的幂的数,都是这样的数:100、10000、1000000……(4、16、64)
观察规律,可以发现 4的幂 需要满足以下条件:
- 最高位是 1,其余都为 0;
- 最高位的 1 应该在奇数位上,比如:100 的 1 在 第三位上;
那么对应的判断方法为:
- 用 num & (num-1) 可以判断条件1,比如:100(4) & 011(3) == 0,结果为 0 说明符合条件1;
- 是否在奇数位可以用 0xaaaaaaaa 判断,16 进制的 a 是 1010,比如:0100(4) & 1010(a) == 0,结果为 0 说明最高位 1 在奇数位上;
三、AC 代码:
class Solution {
func isPowerOfFour(num int) bool {
return num>0 && num&(num-1)==0 && 0xaaaaaaaa&num==0
}
四、总结:
三个条件
n>0 不必说
n & (n-1) == 0 这个条件代表了这个数是2的幂
0xaaaaaaaa&num==0 这代表着二进制位数
范文参考:
【4的幂】【C语言详解】【2种方法】 - 4的幂 - 力扣(LeetCode)
java 与2的幂次方解法相同 从模4取余入手 观察余数和商的变化 捕获特征 重拳出击 - 4的幂 - 力扣(LeetCode)
4的幂(1一定是 4 的幂,不断执行 n /= 4 直到 n ==1 或 n % 4 != 0为止☀) - 4的幂 - 力扣(LeetCode)