题目
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
示例 1:
输入: 16
输出: true
示例 2:
输入: 5
输出: false
使用while循环
对于数num
一直除以4,直到商为1或者不能整除4而返回false
代码:
class Solution {
public boolean isPowerOfFour(int num) {
if(num <= 0) return false;
// 当前仅当num本身是1,或者num整除4到最后商为1
while(num != 1){
// 如果不能被4整除,说明不是4的次幂
if(num % 4 != 0) return false;
num /= 4;
}
// 此时 num一定等于1
return true;
}
}
使用位运算,一行解决
位运算的技巧:
- x & (x-1) 可以去除最低位的
1
- 4的次幂都分布在 20、22、24、26 …,并且4的次幂的二进制都只有一位,即
0001
、0100
如果一个数字去掉了最低位的1
,结果为0,说明这个数字是 2的幂次方
如果上一个条件满足,将这个数字和 ... 0101 0101 0101
(每一位上的1
都表示4的次幂,即数字 1431655765
)进行 &
运算。如果结果不为0,说明存在4的次幂。
class Solution {
public boolean isPowerOfFour(int num) {
// 负数和零不是4的次幂 && 去掉最低位的1为0 && 和 4的次幂
return (num > 0) && ((num&(num-1)) == 0) && ((num&(1431655765)) != 0);
}
}
注意:Java中的位运算符优先级比较低。
会先计算关系表达式(==,>=等等)
所以,使用括号提高优先级