1.链接:
2.思路:
法一:
求4的幂,可转换为求2的幂,只不过后者求的是二进制数只有一位为1的数,
32位中,每一位都可作为2的幂。对于前者,是奇数位可作为4的幂, 即1 3 5 7...
我们可以先求2的幂,然后遍历奇数位上是否出现1,若出现1,则为true,反之为false
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0 || (n & n-1) !=0 ) return false;//排除不为2的幂
while(n != 0) {
if((n & 1) == 1) return true;
n = n>>2;//移两位 1 3 5 7...
}
return false;
}
}
法二:
符合4的幂的二进制,其唯一的1处于1 3 5 7... 中,
而对于n-1,其二进制位为1的个数是偶数个,例如:16是1000, 15是01111
class Solution {
//n的二进制位为1的,处于 1 3 5 7... 而对于n-1,其二进制位为1的个数是偶数个
public boolean isPowerOfFour2(int n) {
if(n<=0 || (n & n-1) !=0 ) return false;//排除不为2的幂
return (Integer.bitCount(n-1) & 1) == 0;//偶数个1则为4的幂
}
//全部用bitCount
public boolean isPowerOfFour(int n) {
// n-1为1的二进制个数为偶数 n为1的二进制个数为1,即2的幂
return (Integer.bitCount(n-1) & 1) == 0 && Integer.bitCount(n) == 1;
}
}
法三:
根据1,3,5,7序列,进行直接匹配
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0 || (n & n-1) !=0 ) return false;//排除不为2的幂
return (n & 0b01010101010101010101010101010101) == n;//直接匹配1,3,5,7
}
}