1 题目
Given an integer, write a function to determine if it is a power of two.
接口 boolean isPowerOfTwo(int n)
2 思路
判断一个整数是否是2的幂次结果数。
0100 ==> 4 ; 1000 ==>8 ; 10000 ==> 16
0011 ==> 3 ; 0111 ==>7 ; 01111 ==> 15
思路1:2的次方数都只有一个1,剩下的都是0。我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数
复杂度:Time O(32); Space O(1)
思路2:如果一个数是2的次方数的话,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0。
复杂度:Time O(1); Space O(1)
3 代码
- 思路1
public boolean isPowerOfTwo(int n) {
int count1 = 0;
for (; n > 0;) {
int tmp = n & 1;
count1 += tmp;
n = n >> 1;
}
boolean is = (count1 == 1);
return is;
}
- 思路2
public boolean isPowerOfTwo(int n) {
boolean is = false;
if (n > 0) {
is = ((n - 1) & n) == 0;
}
return is;
}
4 总结
这是位操作的智力题。