LeetCode 231 Power of Two

题目:

Given an integer, write a function to determine if it is a power of two.

Example 1:

Input: 1
Output: true 
Explanation: 20 = 1

Example 2:

Input: 16
Output: true
Explanation: 24 = 16

Example 3:

Input: 218
Output: false

解法:

判断一个数是不是2的幂,最开始想的是最简单粗暴的解法:

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n<=0) return false;
        
        while(n>2)
        {
            if(n%2!=0) return false;
            n /= 2;
        }
        
        return true;
    }
}

 

后来看到Discussion里有一个巧妙的解法:

class Solution {
    public boolean isPowerOfTwo(int n) {
        
        return n>0 && (n&(n-1))==0;
    }
}

至于为什么n和n-1按位与就能得出结论,解释如下:

 

        首先理解 (n-1)的作用:

        将n的二进制最低位的1改成0。为什么可以将最低位的1改成0?

        注意到,n和n-1仅相差1,假如n的二进制为:******1000    (前面的*为1或0,任意多个,这里的1是n的最低位

        1),那么n-1为:******0111 ,那么n&(n-1):

                                                     

 

 

        可以看到,n的二进制最后一位1变成了0。那么,如果n的二进制只有1个,经过n&(n-1)就会变成0。

 

这里的解释来自以下原文链接,觉得解释的很到位,就贴了过来。

原文链接:https://blog.csdn.net/sinat_30071459/java/article/details/51089268

posted @ 2020-03-26 22:25  好麻烦快点  阅读(146)  评论(0编辑  收藏  举报