Check if Number is Power of Two in DSA C++ - Time & Space Complexity
We want to know how fast we can check if a number is a power of two.
The question is: how does the time needed change as the number gets bigger?
Analyze the time complexity of the following code snippet.
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return (n & (n - 1)) == 0;
}
This code checks if a number is a power of two using a bitwise trick.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A single bitwise AND operation and subtraction.
- How many times: Exactly once, no loops or recursion.
The time to check does not grow with the size of the number.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1 operation |
| 100 | 1 operation |
| 1000 | 1 operation |
Pattern observation: The number of operations stays the same no matter how big the number is.
Time Complexity: O(1)
This means the check happens in constant time, instantly regardless of input size.
[X] Wrong: "Checking if a number is a power of two requires looping through all bits or dividing repeatedly."
[OK] Correct: The bitwise trick does the check in one step without loops, making it very fast.
Knowing this quick check shows you understand bitwise operations and efficiency, a useful skill in many coding problems.
"What if we used a loop to divide the number by 2 repeatedly until it is 1? How would the time complexity change?"
Practice
Solution
Step 1: Understand binary representation of powers of two
A power of two in binary has exactly one '1' bit and the rest are '0's, e.g., 4 is 100.Step 2: Check other options
Odd numbers can have many bits set; divisibility by 3 is unrelated; all bits set to 1 means numbers like 7 (111), not powers of two.Final Answer:
It has exactly one bit set to 1 in its binary form. -> Option BQuick Check:
Power of two = single 1 bit [OK]
- Thinking powers of two are always odd
- Confusing all bits set to 1 with power of two
- Assuming divisibility by 3 means power of two
n is a power of two?Solution
Step 1: Understand bitwise check for power of two
The expression(n & (n - 1)) == 0is true only ifnhas exactly one bit set, andn > 0ensures positive numbers.Step 2: Analyze other options
(n | (n - 1)) == 0 uses OR which doesn't check power of two; (n & (n + 1)) == 0 usesn + 1which is incorrect; (n ^ (n - 1)) == 0 uses XOR which is unrelated.Final Answer:
(n & (n - 1)) == 0 && n > 0 -> Option CQuick Check:
Bitwise AND with n-1 zero means power of two [OK]
- Using OR or XOR instead of AND
- Not checking if n is positive
- Using n + 1 instead of n - 1
int n = 16;
if ((n & (n - 1)) == 0 && n > 0) {
std::cout << "Power of Two";
} else {
std::cout << "Not Power of Two";
}Solution
Step 1: Evaluate the expression for n = 16
16 in binary is 10000; 16 - 1 = 15 (01111). Bitwise AND: 10000 & 01111 = 0, condition true.Step 2: Check if n > 0
16 > 0 is true, so whole condition is true and "Power of Two" is printed.Final Answer:
Power of Two -> Option AQuick Check:
16 & 15 == 0 and 16 > 0 [OK]
- Miscomputing bitwise AND
- Ignoring the n > 0 check
- Confusing output strings
n is a power of two, but it has a bug. What is the bug?
bool isPowerOfTwo(int n) {
return (n & (n - 1)) == 0;
}Solution
Step 1: Analyze the expression without positivity check
The expression returns true for n=0 because 0 & -1 = 0, which is incorrect since 0 is not a power of two.Step 2: Identify missing condition
Addingn > 0fixes the bug by excluding zero and negative numbers.Final Answer:
It does not check if n is positive, so zero or negative numbers return true incorrectly. -> Option AQuick Check:
Check n > 0 to avoid zero/negative false positives [OK]
- Ignoring zero and negative inputs
- Using OR instead of AND
- Wrong return type assumptions
n. Which approach correctly achieves this in C++?Solution
Step 1: Understand the problem
We need the smallest power of two >= n, so we start from 1 and keep doubling (shifting left) until we reach or pass n.Step 2: Analyze options
Use a loop to shift 1 left until the value is >= n. uses a loop with left shift which correctly finds the smallest power of two >= n. Options B, C, D use bitwise operations that do not produce this result.Final Answer:
Use a loop to shift 1 left until the value is >= n. -> Option DQuick Check:
Shift 1 left until >= n to find smallest power of two [OK]
- Using bitwise AND/OR/XOR incorrectly for this problem
- Not handling cases where n is already a power of two
- Assuming bitwise ops alone give next power of two
Ready to prove it?
Pass the test and this pattern moves unknown
