本文共 1363 字,大约阅读时间需要 4 分钟。
给定一个整数,编写一个函数来判断它是否是 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. }
转载地址:http://lsuvi.baihongyu.com/