原题链接: 2的幂
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9cba0351c22e2a5191619e05fcb5f814.png)
思路
本题难度较低,但会引入位运算
方法一:
- 如果这个数小于等于0,直接返回false
- 如果这个数是偶数,除以2;一直循环,直到这个数变成奇数
- 检查这个数最后是不是1,如果是1说明这个数原来是2的幂,如果不是说明不是
还有类似的方法,
- 如果这个数小于等于0,直接返回false
- 给1乘以2,循环,直到结果大于或者等于n
- 若等于,说明n是2的幂,若大于说明不是
这俩种方法一个做的是除法,一个做的是乘法
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
if(n<=0) return false;
while(n%2==0){
n=n/2;
}
if(n==1){
return true;
}else{
return false;
}
}
}
方法二:
使用位运算
首先学习一个知识点,如果一个数是2的幂,那它在二进制表示下,一定是若干个0和一个1。比如8,
用二进制表示为:1000。同是如果把这个数减去1,新得到的数在二进制表示下,一定是若干个1和一个0,且1和0的位置一定是互补的。比如8-1:0111。
1 | 0 | 0 | 0 |
---|---|---|---|
0 | 1 | 1 | 1 |
那么把这俩个数按位与,得到的结果一定是0;
即:如果n是2的幂,那么就有n&(n-1)==0
但注意:0比较特殊,它也符合n&(n-1)==0
基于这个特点就可以写代码了
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
if(n==0) return false;
long m=(long)n;//n-1可能会超出int型数据的范围
if((m&(m-1))==0){
return true;
}else{
return false;
}
}
}
有其它问题可以在评论区交流。