算法记录231-2的幂

241 阅读1分钟

leetcode地址 2的幂次

解题思路:

  • 若n 是2的幂 则一定满足以下条件
    1. 恒有n&(n - 1) == 0这是因为:
      • n为二进制最高为1,其余所有位为0
      • n-1 为二进制最高位为0 其余所有位为1
    2. 一定满足 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
    }