题目:
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
class Solution {
public:
bool isPowerOfFour(int n)
{
// 法一::自己写的笨笨的解法
// if(n == 1) return true;
// if(n < 4) return false;
// int yu;
// while(n > 3)
// {
// yu = n % 4;
// if(yu != 0) return false;
// n /= 4;
// }
// if(n == 1 && yu == 0) return true;
// else return false;
// 法二::看着幂次方,就要联想到位运算呀
/*
1、先计算 n 的二进制位中对应的 1 的个数,做初步判断,如果个数大于1,则肯定不是4的幂次
2、当符合了第一个条件,在用 while 对二进制进行移位操作,判断 二进制中有几个 0
如果有偶数个 0 ,那就是 true
这里有个疑问,感觉只判断了两个条件
第一个: n 的二进制中有 1 个 1
第二个: n 的二进制中有偶数个0
但是没有判断 唯一的一个 1 是不是在最高位,这样是OK的吗?
回答:当然呀,你想想,如果只有一个1,且右移移走了,那这个数不就变成0了吗?小傻瓜
*/
if(n <= 0) return false;
int res = __builtin_popcount(n);
if (res > 1) return false;
int x = 0;
while(n > 1)
{
n >>= 1; //相当于 n = n >> 1 也就是 n = n/2;
x++; // 统计 0 的个数
}
// 如果统计 0 的个数能被2整数,说明有 偶数个0
return x % 2 == 0;
}
};