时间复杂度O(N)的方法很容易想到,一个for或者while循环,从1开始每次乘2就行了.
代码如下:
bool is(int a) {
if (a) {
int t = 1;
while (1) {
t *= 2;
if (t > a) { //t>a就终止循环 如果此时 t == a*2说明a是2的整数幂
break;
}
}
return t == a * 2 ? true : false;
}
return false;
}
但是O(N)的时间复杂度是不能容忍的
进一步观察2的整数幂的规律,我们发现一个2的整数幂a减去1得到a-1,此时a&(a-1)肯定为0,因为(a-1)的最高位始终达不到a的最高位,我们就可以根据这个来判断.
bool isTrue(int a) {
if (a) {
int b = a - 1;
return a & b == 0 ? true : false;
}
return false;
}