题目:
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