Reverse Bits of a Number in DSA C++ - Time & Space Complexity
We want to understand how the time needed to reverse bits changes as the number size grows.
Specifically, how many steps does it take to flip all bits of a number?
Analyze the time complexity of the following code snippet.
unsigned int reverseBits(unsigned int n) {
unsigned int result = 0;
for (int i = 0; i < 32; i++) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
This code reverses the bits of a 32-bit unsigned integer by shifting and masking each bit.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop runs 32 times, once for each bit.
- How many times: Exactly 32 times, fixed for 32-bit numbers.
Since the loop runs a fixed 32 times, the steps do not grow with the number's value but with its bit size.
| Input Size (bits) | Approx. Operations |
|---|---|
| 8 | 8 steps |
| 16 | 16 steps |
| 32 | 32 steps |
Pattern observation: The time grows linearly with the number of bits, not the number's value.
Time Complexity: O(b) where b is the number of bits.
This means the time grows linearly with the number of bits to reverse.
[X] Wrong: "The time depends on the number's value, so smaller numbers run faster."
[OK] Correct: The loop always runs for all bits, so the value does not change the number of steps.
Understanding bit-level operations and their time costs shows your grasp of low-level data handling, a valuable skill in many coding challenges.
"What if we changed the input to a 64-bit number? How would the time complexity change?"
Practice
Solution
Step 1: Understand bit order
Bits are arranged from left (most significant) to right (least significant). Reversing means swapping their order.Step 2: Differentiate from other operations
Flipping bits means changing 0 to 1 or 1 to 0, which is different from reversing order.Final Answer:
Flipping the order of bits from left to right -> Option DQuick Check:
Reverse bits = flip order [OK]
- Confusing reversing bits with flipping bits
- Thinking reversing means shifting bits
- Assuming reversing adds or subtracts value
n?Solution
Step 1: Analyze the loop and bit operations
```cpp unsigned char reverseBits(unsigned char n) { unsigned char result = 0; for (int i = 0; i < 8; i++) { result <<= 1; result |= (n & 1); n >>= 1; } return result; } ``` shifts result left, adds least significant bit of n, then shifts n right. This reverses bits correctly.Step 2: Check other options for correctness
```cpp unsigned char reverseBits(unsigned char n) { unsigned char result = 0; for (int i = 0; i < 8; i++) { result |= (n & 1) << i; n >>= 1; } return result; } ``` does not reverse bits, it copies bits in same order. ```cpp unsigned char reverseBits(unsigned char n) { unsigned char result = 0; for (int i = 0; i < 8; i++) { result <<= 1; result |= ((n >> i) & 1); } return result; } ``` uses wrong bit extraction. ```cpp unsigned char reverseBits(unsigned char n) { unsigned char result = 0; for (int i = 7; i >= 0; i--) { result <<= 1; result |= (n & 1); n >>= 1; } return result; } ``` has wrong loop condition causing infinite loop if i-- is missing.Final Answer:
Option A code correctly reverses bits -> Option AQuick Check:
Shift result left + add LSB of n each step [OK]
- Using wrong loop conditions causing infinite loops
- Not shifting result before adding bits
- Extracting bits incorrectly with wrong shifts
unsigned char reverseBits(unsigned char n) {
unsigned char result = 0;
for (int i = 0; i < 8; i++) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
int main() {
unsigned char n = 13; // binary 00001101
unsigned char reversed = reverseBits(n);
std::cout << (int)reversed << std::endl;
return 0;
}Solution
Step 1: Convert 13 to binary and reverse bits
13 in 8-bit binary is 00001101. Reversing bits gives 10110000.Step 2: Convert reversed binary to decimal
10110000 binary equals 128+32+16=176 decimal.Final Answer:
176 -> Option BQuick Check:
00001101 reversed = 10110000 = 176 [OK]
- Confusing bit reversal with bit flipping
- Not casting unsigned char to int for output
- Misreading binary to decimal conversion
unsigned char reverseBits4(unsigned char n) {
unsigned char result = 0;
for (int i = 0; i <= 4; i++) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}Solution
Step 1: Check loop range
The loop runs from i=0 to i=4 inclusive, so 5 iterations instead of 4.Step 2: Understand effect of extra iteration
Extra iteration shifts result and adds an extra bit, corrupting the reversed bits.Final Answer:
Loop runs one extra time causing incorrect result -> Option AQuick Check:
Loop should run 4 times, not 5 [OK]
- Using <= instead of < in loop condition
- Forgetting to shift result before OR
- Ignoring return statement correctness
Solution
Step 1: Understand divide-and-conquer bit reversal
Divide bits into pairs, swap them; then groups of 4 bits (nibbles), swap; then bytes, then half-words.Step 2: Use masks and shifts for efficient swapping
Use bit masks to isolate groups and shift them to swap positions without looping over each bit.Final Answer:
Swap bits in pairs, then nibbles, then bytes, then half-words using masks and shifts -> Option CQuick Check:
Divide-and-conquer uses masks and shifts [OK]
- Using slow bit-by-bit loops for large bit sizes
- Trying string conversion which is inefficient
- Misunderstanding recursion for bit reversal
Ready to prove it?
Pass the test and this pattern moves unknown
