[LeetCode]--231. Power of Two

该博客介绍了一道LeetCode问题,即判断一个整数是否为2的幂。2的幂在二进制表示中只有一个1,可以通过位运算检查`N & (N-1)`是否为0来确定。

Given an integer, write a function to determine if it is a power of two.

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

如果是power of two, 则2进制表达中,有且仅有一个1. 可以通过移位来数1的个数, 这里用了一个巧妙的办法, 即判断 N & (N-1) 是否为0.

public boolean isPowerOfTwo(int n) {
        if (n <= 0)
            return false;
        return (n & (n - 1)) == 0;
    }
### 代码原理分析 #### 1. 2的幂的二进制表示特点 在二进制表示中,一个数如果是2的幂,那么它的二进制形式有且仅有一位是1,其余位都是0。例如: - \(2^0 = 1\),二进制表示为 `0001` - \(2^1 = 2\),二进制表示为 `0010` - \(2^2 = 4\),二进制表示为 `0100` - \(2^3 = 8\),二进制表示为 `1000` #### 2. `n & (n - 1)` 的作用 `&` 是按位与运算符,它会将两个数的对应二进制位进行与运算,只有当两个对应位都为1时,结果的该位才为1,否则为0。 当 `n` 是2的幂时,`n - 1` 的二进制表示会将 `n` 中唯一的那个1变为0,并且该位右边的所有位都变为1。例如: - 若 \(n = 8\),二进制是 `1000`,那么 \(n - 1 = 7\),二进制是 `0111` - 对 `n` 和 `n - 1` 进行按位与运算:`1000 & 0111 = 0000` 对于不是2的幂的数,`n` 的二进制表示中会有多个1。例如 \(n = 6\),二进制是 `0110`,\(n - 1 = 5\),二进制是 `0101`,`0110 & 0101 = 0100`,结果不为0。 #### 3. `n > 0` 的作用 因为负数和0都不可能是2的幂,所以需要先判断 `n` 是否大于0。 ### 代码示例 ```cpp #include <iostream> bool isPowerOfTwo(int n) { return n > 0 && (n & (n - 1)) == 0; } int main() { int num = 8; if (isPowerOfTwo(num)) { std::cout << num << " is a power of two." << std::endl; } else { std::cout << num << " is not a power of two." << std::endl; } return 0; } ``` ### 复杂度分析 - **时间复杂度**:\(O(1)\),因为只进行了常数级的位运算- **空间复杂度**:\(O(1)\),只使用了常数级的额外空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值