力扣-2的幂

tianyi Lv3

题目链接:https://leetcode.cn/problems/power-of-two/description/?envType=daily-question&envId=2025-08-09

题目

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。


分析

这道题非常简单,但是我们要学习的一些有关位运算的技巧和思路。

首先就是如何判断一个数是2的幂,单纯从平方开方来看可能有点复杂,我们不妨从二级制的角度来看:一个数 n 是 2 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1 个 1

那我们的问题就变成了如何判断一个数的二级制表达中只有一个1,这里有两个技巧

技巧一 n \& (-n)

该运算可以直接获取 二进制表示中的**最低位的 **。

由于负数在计算机中按照补码规则存储, 的二进制表示为 的每一位取反再加

假设 的二进制表示为:

其中:

  • 表示若干个高位
  • 表示最低位的那个
  • 表示若干个

那么 的二进制表示为:

进行按位与运算:
Misplaced &(a,1,0\cdots0)_2 \ &\ (\overline{a},1,0\cdots0)_2

高位全部变为 ,最低位的 及其后的所有 保持不变,从而得到最低位的

如果 是正整数并且:
Misplaced & n \ &\ (-n) = n
的幂。

技巧二 n \& (n - 1)

该运算可以**移除 二进制表示中的最低位 **。

假设 的二进制表示为:

那么 的二进制表示为:

按位与运算:
Misplaced &(a,1,0\cdots0)_2 \ &\ (a,0,1\cdots1)_2

高位 保持不变,最低位的 及其后的所有位变为 ,实现了移除最低位的

如果 是正整数并且:
Misplaced & n \ &\ (n - 1) = 0
的幂。
Rust中的错误处理

代码

1
2
3
4
5
6
7
8
9
10
11
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return n > 0 && (n & (n - 1)) === 0;
};

var isPowerOfTwo = function(n) {
return n > 0 && (n & -n) === n;
};
  • Title: 力扣-2的幂
  • Author: tianyi
  • Created at : 2025-08-09 09:34:47
  • Updated at : 2025-08-21 14:01:32
  • Link: https://github.com/ztygod/2025/08/09/力扣-2的幂/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments