Given an integer (signed 32 bits), write a function to check whether it is a power of 4.(给定一个32位整型数,判断其是否是4的幂)
1.个人分析
判断一个整型数是否是4的幂,必定是从2的幂中寻找符合条件的。1,2,4,8,16,32,64都是2的幂,其中1,4,16,64为4的幂,观察这些数的二进制位发现,它们的1都处在奇数位上,而1在偶数位上的数则都不是4的幂,所以可以用(n & 0xAAAAAAAA)==0作为筛选条件。
2.个人解法
(1)位操作
bool isPowerOfFour(int num)
{
return (num >=1) && (0 == (num&(num-1))) && (0 == (num&0xAAAAAAAA));
}
(2)迭代
bool isPowerOfFour(int num)
{
if(num<1)
return false;
while(num%4 == 0)
num /= 4;
return num == 1;
}
3.总结
结果显示,位操作解法要比循环迭代解法要慢一倍;但如果把(0 == (num&(num-1))) && (0 == (num&0xAAAAAAAA))两者的顺序对调一下,结果运行时间和迭代解法是一样的,很可能是因为逻辑与运算是短路操作,前面的条件语句为false就不用执行后面的条件语句,所以程序就加快运行了。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。