class Solution {
public:
bool isPowerOfTwo(int n) {
for(int i =0;i<n;i++){
int m = std::pow(2,i);
if(n == m)return true;
}
return false;
刚开始时没考虑到会有很大的数据,所以直接使用了int,后来报错使用long,还是报错,然后就使用了double,对倒是对了,但是执行时间太久了,该思路就被舍弃了
然后想到了异或(之前做题时碰到异或去搜了一篇文章)按位异或运算符的讲解 (详细)-CSDN博客
这篇文章讲的很细也很通俗易懂,末尾提到了可以用同或解决2的幂次方问题
简单来说,利用二进制的特性,若一个数为2的幂次方,必只有一个数不为零其他全为零,而同或(&)可以将相同的变为1,不同的变为0
若n是,则n-1与n每一位都不同同或为0,若不是,总有相同的,必有1
此时貌似解决了
但是你写return (n&n-1)会出现一个新问题,就是0,然后又出现一个新问题就是负数
所以必须加了一个条件是n>0,便有以上和以下解答
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
};