1、描述
给定一个整数,编写一个函数来判断它是否是2的幂次方
例1:输入:1
输出:true
解释:2^0 = 1
例2:输入:16
输出:true
解释:2^4 = 16
例3:输入:218
输出:false
2、算法
1)二进制
思想: 1、数字n若是2的次方,则一定满足以下条件:
1)二进制表示下,n最高位为1,其余所有位为0;
2)二进制表示下,n - 1最高位为0,其余所有位为1(除了n == 1的情况下,n - 1 == 0,即末位为最高位);
3)n <= 0时一定不是2的次方。
2、因此,判断n > 0且n & (n - 1) == 0则可确定n是否是2的次方。
func isPowerOfTwo(_ n : Int)->Bool{
/*
二进制:
*/
return n>0 && (n & (n-1) == 0)
}
2)递归
思想: 逐步增加除数的大小,每次增加为之前除数的2倍,如果除以除数为0,则除数重新置位2,以递归的方式重新计算
func isPowerOfTwo(_ n : Int)->Bool{
/*
递归
*/
if n == 0 {
return false
}else{
return cal(n)
}
}
private func cal(_ n : Int)->Bool{
var n = n
var div = 2
while (n/div != 0) && (n%div == 0) {
n = n / div
div = div*2
}
if n%2 == 0 {
return cal(n)
}else if n == 1 {
return true
}else{
return false
}
}