问题:
难度:easy
网址链接:https://leetcode.com/problems/power-of-two/
说明:
水题,输入一个N正整数,求是否是2^N的数。
输入案例:
Example 1:
Input: 1
Output: true
Explanation: 20 = 1
Example 2:
Input: 16
Output: true
Explanation: 24 = 16
Example 3:
Input: 218
Output: false
我的代码:
正常思路是输入一个N,然后和2的N次方比较,发现最后2的N次方超过了它就不是,否则发现相等就是。
不过可以更简单,就是利用位运算,2的指数在 32位带符号位 INT 里面都是只有一个位是1的数,运算量32次以内就可以了。
class Solution {
public boolean isPowerOfTwo(int n) {
// 排除0
if(n <= 0) return false;
// 使用 位元 作为 蒙版,找出第一个 1
int a = 1;
for(int i = 0;i < 32;i ++) {
// 找到了之后,马上跳出
if((n & a) != 0) break;
// 没找到就继续移位
a <<= 1;
}
// -1 ^ a 将蒙版反转,然后和n进行 &,如果仅有一个 1,那么true,不然false
return ((-1 ^ a) & n) == 0;
}
}
其它代码:
如果只有一个1,n - 1的话得出得数和 n 进行 &,都为0。
class Solution {
public boolean isPowerOfTwo(int n) {
// 末尾有1,或者不只有一个1的数,& 都不会为0
return (n > 0) && (n & (n - 1)) == 0;
}
}