题目要求:Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
- 通过试验可以知道,4的n次幂对应的二进制有且只有一个1,并且1的位置还是在奇数的位置(比如100==4)。
- n&(n-1)可以去掉 n 的位级表示中最低的那一位,并且在只有一个1的情况下,这样相与的结果一定是0。
- 再统计一下(n-1)中1的个数,由于4的n次幂的特性,n-1中1的个数一定为偶数个:比如100,减去1之后,变成011。
附上代码:
public static boolean isPowerOfFour2(int num) {
int num1 = num - 1;
boolean flag = (num > 0) && (num & num1) == 0;
if(flag == false)
return false;
int numOf1 = 0;
while(num1 != 0){
if((num1 & 1) == 1)
numOf1 ++;
num1 >>= 1;
}
if(numOf1 % 2 == 0)
return true;
return false;
}
细心的同学可以注意到,我起的方法名是isPowerOfFour2,因为我无意中看到了一个特别有趣的库函数想分享给大家
Integer.toString(n, 4)
这个函数的含义其实就是将数字n转换为以后面的数字为基数的进制数,也就是四进制数字。最后再利用正则表达式匹配就能达到想要的效果,话不多说 上代码。
public static boolean isPowerOfFour(int n){
// 下面的toString(int i, int index)其实就是将i转换为index进制的数字
// 将数字n转换为4进制的数字
return Integer.toString(n, 4).matches("10*");
}