LeetCode 231 | 2的幂
题目
题解
方法一:循环除2
只要当前数是2的倍数,将其除以2,判断最后是否为1,不是则该数不是2的幂。
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0)return false;
while(n%2==0){
n=n/2;
}
return n==1;
}
};
方法二:位运算
2的幂用二进制表示的有一个特点,只有一个1且位于最高位。例如1=(1),2=(10),4=(100),8=(1000)。。。所以解决 该问题基本思路是:找到该数字的二进制表示法最低位的1,将其置为0后检查该值是否为0,如果为0则是满足题意。
方法:n&(n-1)==0?
假设任意整数n,二进制表示为(a10…0),
则n-1的二进制表示为(a01…1).,其中a是最后一个1之前的表示,
用与运算后最后一个1及其之后的表示背置为0,前面部分不变。所以如果该运算最后结果为1则表示n的二进制表示的最后一个1位于最高位,即为2的幂。否则不是
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0)return false;
return (n&(n-1))==0;
}
};
用n&(-n)==n?也可以,具体原因自己分析吧。
提示:负数是按照补码规则在计算机中存储的,-n 的二进制表示为 n 的二进制表示的每一位取反再加上 1.