20240219-2的幂

题目要求

给定一个整数 n,如果它是 2 的幂,则返回 true。否则,返回 false。

如果存在一个整数 x,使得 n == 2^x,则整数 n 是 2 的幂。

思路

这个题目首先自然是想到用循环和if判断,但是题目中有一个建议是不使用循环完成这个题目。那么就要考虑到2的幂次的性质.

首先,我们知道如果一个数是2的幂次方,那么它的二进制表示中只有一个1,并且1后面跟着若干个0。比如,2 (10)、4 (100)、8 (1000) 等等。那么,我们如何利用这个性质来通过位运算来解决这个问题呢?

有一个位运算的技巧是,对于任何一个数n,如果n是2的幂次方,那么n & (n-1)的结果会是0。这是因为n是2的幂次方,意味着它的二进制表示中只有一个1,减去1之后,这个1就变成了0,而且1后面的所有0都变成了1。所以,n和n-1进行与操作的结果会是0。例如,4 (100) 和 3 (011) 进行与操作的结果是0。

理解n & (n-1)的作用 :这个位运算的关键在于理解&操作符,它是按位与操作。对于两个二进制数,只有在相同位置上的两个位都为1时,结果的该位才为1;否则,结果的该位为0。

  • 当n是2的幂时,它的二进制表示中只有一个位是1,其余都是0。例如,2的幂次方4在二进制中是100,8是1000
  • 当我们计算n-1时,最低位的1变成0,而所有更低位的0变成1。继续以4为例,4-1=3,在二进制中3是011
  • 然后,当我们进行n & (n-1)操作时,原数n的最低位的1和n-1的所有位上的1都会被清零。这是因为n的最低位的1变成了0,且n-1在这一位上是1(与n在这一位上正好相反),其他位上n为0,n-1为1,所以按位与的结果为0。

代码

cpp 复制代码
class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        return (n & (n-1)) == 0;
    }
};
相关推荐
手写码匠2 分钟前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
果壳science1 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
302wanger2 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug3 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3333 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster4 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
liliangcsdn4 小时前
最终留出样本/样本外测试集-holdout解读
算法
爱敲代码的小黄4 小时前
机器学习入门:从数据、训练到业务决策
算法
数据知道4 小时前
哈希与密码存储——bcrypt、Argon2、盐值与彩虹表
网络·算法·安全·网络安全·密码学·哈希算法
haon11225 小时前
树模型在信贷风控怎么用——从决策树到 XGBoost
大数据·人工智能·算法·决策树·机器学习·数据挖掘