解题思路:
- 若n 是2的幂 则一定满足以下条件
恒有n&(n - 1) == 0这是因为:- n为二进制最高为1,其余所有位为0
- n-1 为二进制最高位为0 其余所有位为1
- 一定满足
n > 0
class Solution {
// 方法1 logN的时间复杂度
func isPowerOfTwo(_ n: Int) -> Bool {
var val = n
while val != 0 {
if val == 1 {
return true
}else{
let tmpVletletal = val >> 1
if tmpVal*2 == val {
val = tmpVal
} else {
return false
}
}
}
return false
}
// 方法2 : 上边的原理
func isPowerOfTwo2(_ n: Int) -> Bool {
return n > 0 && n&(n-1) == 0
}
// 方法3: logN的时间复杂度
func isPowerOfTwo3(_ n: Int) -> Bool {
if n == 0 {
return false
}
while n % 2 == 0 {
n /= 2
}
return n == 1
}
}
在补码表示中 -x = ~x + 1 要计算-x,则需要将x所有位取反在加1
在二进制中~x + 1 表示将该1移动到~x中最右边的0的位置,并将所有较低位的位设置为0 ,而~x最右边的0的位置对应于x最右边的1的位置
即 -x = ~x + 1此操作将x所有位按位取反,但是最右边的1除外
x和-x 只有一个共同点: 最右边的1,这说明 x&(-x)将保留最右边的1 ,并将其他的位设置为0
func isPowerOfTwo3(_ n: Int) -> Bool {
if n == 0 {
return false
}
return n & (-n) == n
}