139 lines
2 KiB
Markdown
139 lines
2 KiB
Markdown
# Leetcode Power-of-Two
|
|
|
|
#### 2022-07-22 14:30
|
|
|
|
> ##### Algorithms:
|
|
>
|
|
> #algorithm #bit_manipulation
|
|
>
|
|
> ##### Data structures:
|
|
>
|
|
> #DS #bitset
|
|
>
|
|
> ##### Difficulty:
|
|
>
|
|
> #coding_problem #difficulty_medium
|
|
>
|
|
> ##### Additional tags:
|
|
>
|
|
> #leetcode
|
|
>
|
|
> ##### Revisions:
|
|
>
|
|
> N/A
|
|
|
|
##### Related topics:
|
|
|
|
##### Links:
|
|
|
|
- [Link to problem](https://leetcode.com/problems/power-of-two/)
|
|
|
|
---
|
|
|
|
### Problem
|
|
|
|
Given an integer `n`, return _`true` if it is a power of two. Otherwise, return `false`_.
|
|
|
|
An integer `n` is a power of two, if there exists an integer `x` such that `n == 2x`.
|
|
|
|
#### Examples
|
|
|
|
**Example 1:**
|
|
|
|
**Input:** n = 1
|
|
**Output:** true
|
|
**Explanation:** 20 = 1
|
|
|
|
**Example 2:**
|
|
|
|
**Input:** n = 16
|
|
**Output:** true
|
|
**Explanation:** 24 = 16
|
|
|
|
**Example 3:**
|
|
|
|
**Input:** n = 3
|
|
**Output:** false
|
|
|
|
#### Constraints
|
|
|
|
- `-231 <= n <= 231 - 1`
|
|
|
|
### Thoughts
|
|
|
|
> [!summary]
|
|
> This is a #bit_manipulation problem.
|
|
> The solution can come from investigating multiple
|
|
> examples and find the common rules
|
|
|
|
Simple solution using bit masking:
|
|
|
|
#### Method 1, using masking
|
|
|
|
- if n <= 0, return false, because it's impossible to be power of 2.
|
|
- else, return !(n & (n - 1))
|
|
|
|
power of 2 and --1 looks like this
|
|
|
|
```
|
|
2 : 10
|
|
1 : 01
|
|
|
|
4 : 100
|
|
3 : 011
|
|
|
|
8 : 1000
|
|
7 : 0111
|
|
```
|
|
|
|
so, if it is power of 2, `!(n & (n - 1))` will produce true.
|
|
|
|
otherwise, `(n & (n - 1))` will produce something other than 0.
|
|
|
|
#### Method 2, count bits
|
|
|
|
power of 2 must have one and only one `true` in the bitset:
|
|
|
|
```
|
|
2 : 10
|
|
4 : 100
|
|
8 : 1000
|
|
...
|
|
```
|
|
|
|
So, by counting if the bitset has only one `true`.
|
|
|
|
### Solution
|
|
|
|
#### Method 1:
|
|
|
|
```cpp
|
|
class Solution {
|
|
public:
|
|
bool isPowerOfTwo(int n) {
|
|
// n == 0: return 0
|
|
// n != 0: return !(n & (n - 1))
|
|
if (n <= 0) {
|
|
return false;
|
|
} else {
|
|
return !(n & (n - 1));
|
|
}
|
|
}
|
|
};
|
|
```
|
|
|
|
#### Method 2:
|
|
|
|
```cpp
|
|
class Solution {
|
|
public:
|
|
bool isPowerOfTwo(int n) {
|
|
if (n <= 0) {
|
|
return false;
|
|
} else {
|
|
return (bitset<32>(n).count() == 1);
|
|
}
|
|
}
|
|
};
|
|
```
|