给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1 输出: true 解释: 2的0次方 = 1
示例 2:
输入: 16 输出: true 解释: 2的4次方 = 16
示例 3:
输入: 218 输出: false
思路1:如果每次将这个数除以2没有余数,直到得到数字1,那么这个数就是2的若干次幂。
class Solution(object):
def isPowerOfTwo(self, n):
"""
:type n: int
:rtype: bool
"""
if n < 1:
return False
while n%2 == 0:
n /= 2
return True if n==1 else False
思路2:2的幂次 x
表示成二进制一定是一个1后面若干个0,那么 如果将这个数减去1x-1,
一定是一个0后面若干个1,所以对这两个数按位相与,必为0,即 x & (x-1) = 0
,非2的幂无法得到0。
class Solution(object):
def isPowerOfTwo(self, n):
"""
:type n: int
:rtype: bool
"""
return n > 0 and not (n & n-1)
以下是Java版本:
题目大意:
给定一个整数,编写函数判断它是否是2的幂。
解题思路:
如果一个整数是2的幂,那么它的二进制形式最高位为1,其余各位为0
等价于:n & (n - 1) = 0,且n > 0
比较简单,就是移位判断一下二进制数一共有多少个1,如果只有一个,那就是2的幂次方啦
1. public class Solution {
2. public boolean isPowerOfTwo(int n) {
3. int sum = 0;
4. if(n <= 0){
5. return false;
6. }
7. for(int i = 0;i < 32;i++){
8. sum += (n>>>i)&1;
9. }
10. return (sum == 1? true:false);
11. }
12. }
利用2的幂 其二进制上的特点,来进行判断; 2^n在二进制上都是1000...0(n个零的特点); 减去1,二进制上就会变成1111....111(n个零)
//例如,8的二进制是1000,7的二进制是0111,相与为0
1. public class Solution {
2. public boolean isPowerOfTwo(int n) {
3. return n > 0 && (n & (n - 1)) == 0;
4. }
5. }