用 O(1) 时间检测整数 n 是否是 2 的幂次。
这个问题一开始我是想用求Log的方法算
public static boolean checkPowerOf2(int n) {
// write your code here
if(n<=0) return false;
double answer=Math.log(n)/Math.log(2);
if(answer%1>0){
return false;
}
return true;
}
但是才跑测试用例的时候出现了问题
当我checkPowerOf2(536870912)就报了false
输出一下answer发现 answer = 29.000000000000004
这应该是在计算中出现了误差
于是我昧着良心改了代码
if(answer%1>0.00000000000001){
return false;
}
这样虽然能跑过测试用例了,但是感觉不是正途
于是我去网上搜了一下- -
来源于http://www.cnblogs.com/jcliBlogger/p/4612213.html
class Solution {
2 public:
3 /*
4 * @param n: An integer
5 * @return: True or false
6 */
7 bool checkPowerOf2(int n) {
8 // write your code here
9 return n > 0 && ((n & (n - 1)) == 0);
10 }
11 };
在这里真是跪了,太机智了
2^n=1000000000000 的形式
而2^(n-1)=0111111111111
所以只要与一下就可以得到结果。