位运算解和&运算解
>问题:
给一个数n,如果该数是2的幂,返回true;否则发挥flase;
>思路:
法一:
<<位运算解:
1. 将该数与每个2的幂进行比较
2. 2的幂可以用 1<<? 表示
法二:
&位运算解:
1. 首先了解一下,当一个数减一对该数的二进制有何影响
2. 经测试
16的二进制:10000
15的二进制为:1111
3. 那么该结论可以用在该题!
4. 当n是2的幂时, 它的二进制形式假设为:100000
5. 我们给n算术上减去1,就得到n-1的二进制:011111
6. 这里想到&运算的性质:均1才1,否则为0
7. 所以!当n&(n-1)等于0的时候,就说明该n是2的幂
8. 但是当你写出 `return ((n-1)&n)==0;`的时候又不正确
9. 因为没有考虑n=0的情况:n=0不是2的幂次方,但却也满足return
10. 所以要对n加以限制
11. 那么`return n>0&&((n-1)&n)==0;`就正解了
法一代码:
public static boolean isPowerOfTwo(int n) {
for (int i=0;i<31;i++){
int num=1;
if ((num<<i)==n){
return true;
}
}
return false;
}
法二代码:
public static boolean isPowerOfTwo(int n) {
return n>0&&((n-1)&n)==0;
}