【Leetcode】231. 2的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true;否则,返回 false

如果存在一个整数 x 使得 n == 2x ,则认为 n2 的幂次方。

示例 1:

输入:n = 1

输出:true

解释:20 = 1

示例 2:

输入:n = 16

输出:true

解释:24 = 16

示例 3:

输入:n = 3

输出:false

提示:

-231 <= n <= 231 - 1

  • 进阶 :你能够不使用循环 / 递归解决此问题吗?

AC:

cpp 复制代码
class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n <= 0)
            return false;
        // 2 的幂的二进制表示中只有一个 1,
        // 所以 n & (n - 1) 应该等于 0
        return (n & (n - 1)) == 0;
    }
};
  • 这是道很典型2的幂 判断 题型
  • 至于为何能够判断?

解释如下:

2 的幂的二进制表示里,只有一个 1

1 -> 0001

2 -> 0010

4 -> 0100

8 -> 1000

发生了什么?

n - 1 会把 n 最高位的那个 1 变成 0

并把该位右边的所有低位 0 变成 1

例如

bash 复制代码
n = 8 (1000)
n - 1 = 7 (0111)
n & (n - 1) = 1000 & 0111 = 0000

对于任意只有一个 1 的数,nn-1 在那个位置上一定互斥,所以 按位与为 0

为什么不是其它数?

如果 n 不是 2 的幂,例如 n = 6:

6 = 0110

5 = 0101

6 & 5 = 0100,不是 0

6 有两个 1n-1 只会清掉最右边的 1,剩下的高位 1 仍然在结果中。

∴ 这个表达式的逻辑

n > 0

n 只有一个 1 位

n & (n - 1) 结果就是 0

因此 (n & (n - 1)) == 0 能返回 true,表示 n2 的幂。


附上官方题解

相关推荐
玛卡巴卡ldf32 分钟前
【LeetCode 手撕算法】(细节知识点总结)
java·数据结构·算法·leetcode·力扣
Carlos_Xu39 分钟前
Linux基础-基础命令
linux
风曦Kisaki1 小时前
# Linux实战笔记-HIS项目实战Day01:版本控制与Git基础
linux·笔记·git
wanzehongsheng1 小时前
零碳产业园光伏园区光伏电站追踪对比固定:发电增益技术边界分析
算法·光伏发电·光伏·零碳园区·太阳能追光·低碳环保·追踪电站
KobeSacre1 小时前
CyclicBarrier 源码
java·jvm·算法
手写码匠1 小时前
注意力机制全家桶:从 Multi-Head 到 GQA 再到 Flash Attention 的手写实现
人工智能·深度学习·算法·aigc
jsons12 小时前
rocky8内网离线批量补丁(你之前搭建的架构,多台服务器首选,无订阅)
linux·运维·服务器
学究天人2 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷3.2)
线性代数·算法·机器学习·数学建模·动态规划·抽象代数·拓扑学
阿拉斯攀登2 小时前
SPI 设备驱动开发
linux·驱动开发·嵌入式硬件·linux内核·嵌入式·linux驱动·spi
阿拉斯攀登2 小时前
定时器与延时:内核定时器、hrtimer 与延时函数
linux·嵌入式硬件·linux内核·嵌入式·linux驱动