问题描述
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例
输入: 1
输出: true
解释: 20 = 1
输入: 16
输出: true
解释: 24 = 16
输入: 218
输出: false
思路
首先,这题一开始我没啥头绪,写了个循环。求2
的i
次方等于不等于n
,如果等于则返回true
,不等于返回false
。后来发现有一些badcase
,看上去像是溢出的,然后就用了long
,过了。(方法一)
后来写了几项:2
的0
次方,是1
,二进制是1
. 2
的1
次方是2
,二进制是10
,2
的2
次方是4
,二进制是100
. 嘿嘿发现规律了? 嗯! 就是8421
大法:即,如果一个数是2
的n
次方,那么它的二进制表示只有最左边是1
,其余都是0
. 于是乎我写了个移位程序,如果碰到的不是第一位二进制,那么必然是0
,否则不对。(方法二, beat 100%)
后来想了一下,我完全可以用更优雅的方法来做。 我们已经知道了符合条件的数的二进制结构。我们发现,如果n
是符合条件的,那么n-1
的二进制表示肯定与n
的二进制表示完全相反。 所以我们只需要判定n&(n-1)
的值即可。(方法三)
方法一
Java版
public boolean isPowerOfTwo1(int n) {
int i = 0;
for(i = 0; i < 1e7 && (int)Math.pow(2,i) < n; i++);
return (long)Math.pow(2,i) == n;
}
方法二
Java版
public boolean isPowerOfTwo2(int n) {
for(int i = n; i > 1; i>>=1){
int tmp = i;
if((tmp&1) == 1){
return false;
}
}
return true;
}
方法三
Java版
class Solution {
public boolean isPowerOfTwo(int n) {
if(n < 1) return false;
return (n&(n-1)) == 0;
}
}