知道的大概有三种算法
1)直接算,首先看这个num可不可以被四整除,可以的话除四,不可以返回false,一直到最后看是不是等于1,这种方法对于每个数都是通用的。
2)直接查找,其实也很快,一共32位,每次把1左移两位,一直移动15次就可以找到所以4的幂次了,感觉这样速度很快,只要15次运算。而且对于一半的数都通用,一般的数假如是3,那么就每次乘以三就好了。
3)分析,如果是四的幂次,肯定是把1向左移动偶数次得到的,那么这个数有个特征,在二进制标识中只有一个1,而且这个1的右面有偶数个0。速度很快,同样也可以找2的幂次,8的幂次等,但3的米幂次等就不好用。
#include <iostream>
using namespace std;
int isPowerOf4_1(int num)
{
if(num < 1)
return -1;
while(num >= 4)
{
if(num%4 == 0)
num /= 4;
else
return -1;
}
if(num == 1)
return 1;
else
return -1;
}
int isPowerOf4_2(int num)
{
int time = 0;
int temp = 1;
while(time < 16)
{
if(num == temp)
return 1;
else
temp = temp<<2;
time++;
}
return -1;
}
int isPowerOf4_3(int num)
{
if(num <= 0)
return -1;
if(num&(num-1) != 0)
return -1;
int numOfZero = 0;
while(num != 1)
{
num = num>>1;
numOfZero++;
}
if(numOfZero%2 == 0)
return 1;
}
int main()
{
cout<<isPowerOf4_3(4)<<endl;
return 0;
}