LeetCode - 231. Power of Two | Lacerta

231. Power of Two

题目

problem

题意分析

本体需要判断一个整数是否是2的幂。

本题考点

判断二的次幂。

解法I - 位运算判断法

我们首先来考虑特殊情况,当一个整数为负数或者0的时候,他就不可能是2的幂。

也就是说只有一个整数是正数的时候,他才能够是2的幂。

我们来观察一下2的幂:1, 2,4,8,16,32等

对应的二进制为1, 10, 100, 1000, 10000…

可以发现,二的幂对应的二进制中,只有一个1,剩下的全是0。

即只要这个正整数二进制中有且只有一个1,那它必定是2的幂。

我们可以通过n & (n - 1)可以去掉二进制中的倒数第一个1(参考191. Number of 1 Bits)

当我们去掉最后一个1时,如果整个二进制中没有1,说明这个二进制数只有一个1,也就是其为2的幂。

实现
class Solution {
  public boolean isPowerOfTwo(int n) {
    // 如果是负数或0,则显然不是2的幂
    
    // 去掉最后一个1,整个数为0,说明二进制中只有一个1
    // 原数字即为2的幂
    
    return (n > 0) && (n & (n - 1)) == 0;
  }
}