给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
示例 1:
输入: 16
输出: true
示例 2:
输入: 5
输出: false
和2的幂那一题类似,由于4的幂如,16 = 0b10000, 4 = 0b100,所以4的幂中,也只会出现1个1,并且这个1的位置肯定是在奇数位上。所以可以用简单的循环轻松解决:
class Solution {
public boolean isPowerOfFour(int num) {
if(num <= 0) return false;
int cnt = 0;
//记录1出现的位置
int i = 0;
while(num != 0){
if((num & 1) == 1){
cnt++;
i++;
if(i % 2 == 0) return false;
}else{
i++;
}
//不可能有多个1
if(cnt > 1) return false;
num >>= 1;
}
return true;
}
}
【解法2,优化】:
看了评论区,发现自己用循环效率太低了。其实没有必要通过循环来进行奇数位的校验。
用0x55555555 & num,如果这个结果 = 0 ,那么就说明,num的奇数位上肯定不存在1.
因为0x55555555 = 0b01010101010101010101010101010101。这个特点很优秀。
进一步思考,如果要进行偶数位校验呢?
0x22222222是0b00100010001000100010001000100010
0x88888888是0b10001000100010001000100010001000
这两者配合起来可以用来校验偶数位
所以简化代码:
2ms,击败98%
class Solution {
public boolean isPowerOfFour(int num) {
int temp = num & (num - 1);
//主要是要看num的奇数位上是否有1
if(num > 0 && temp == 0 && (num & 0x55555555) != 0){
return true;
}else{
return false;
}
}
}