⭐算法入门⭐《位运算 - 位与》简单01 —— LeetCode 509. 2 的幂
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《位运算 - 位与》简单01 —— LeetCode 509. 2 的幂相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
给你一个整数 n n n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x x x 使得 n = 2 x n = 2^x n=2x ,则认为 n n n 是 2 的幂次方。
样例输入: 16
样例输出: true
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
bool isPowerOfTwo(int n) {
}
};
3、原题链接
二、解题报告
1、思路分析
- 如果一个数是 2 的幂,它的二进制表示必然为以下形式:
- 1 00...00 ⏟ k 1\\underbrace{00...00}_{\\rm k} 1k 00...00
- 这个数的十进制值为 2 k 2^k 2k。
- 那么我们将它减一,即 2 k − 1 2^k-1 2k−1 的二进制表示如下(参考二进制减法的借位):
- 0 11...11 ⏟ k 0\\underbrace{11...11}_{\\rm k} 0k 11...11
- 于是 这两个数位与的结果为零,于是我们就知道了如果一个数
x
x
x 是 2 的幂,那么
x & (x-1)
必然为零。而其他情况则不然。 - 所以本题的答案为:
(x & (x-1)) == 0
2、时间复杂度
- 没有任何循环操作,时间复杂度 O ( 1 ) O(1) O(1)。
3、代码详解
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n <= 0) {
return false; // (1)
}
return ( n & (n - 1) ) == 0; // (2)
}
};
-
(
1
)
(1)
(1) 任何数的幂必然大于 0,所以 小于等于 0 时直接返回
false
; - ( 2 ) (2) (2) 判断 2 的幂的核心语句,上文已解释;
- 更多有关于位与运算符的作用,可以参考这篇文章:☀️光天化日学C语言☀️(14)- 位运算 & 的应用 。
三、本题小知识
涉及到 2 的 幂的操作,可以考虑二进制表示后,利用位运算进行加速。
以上是关于⭐算法入门⭐《位运算 - 位与》简单01 —— LeetCode 509. 2 的幂的主要内容,如果未能解决你的问题,请参考以下文章