leetcode刷题9
今天遇到的题是LeetCode第231题。该题是一道简单题,要求输入一个数n,判断这个数是不是2的幂次方
看到这个题,首先想到的就是利用位运算,因为二进制的位运算是比较高效的
我自己的解决方案是下面的代码:
public static boolean judge(int n){ int num=1; boolean flage=false; while (num<=n){ if (num==n){ flage=true; break; }else { num=num<<1; } } return flage; }
但是该方案在n特别大的时候,会超时。在参考了其他人的解答方案后,发现如果一个数n是2的幂次方,那么这个数一定满足三个条件:
①这个数的二进制最高位是1,其他位是0;
②这个数减一的最高位是0,其他位是1;
③这个数一定大于0
因此可以利用位运算中的与,代码如下:
public static boolean judge2(int n){ //if (n<=0) return false; //return ((n&(n-1))==0); //或者写成 return n>0 && (n&(n-1))==0; }