245. Reverse 32 Bits
Problem
Reverse the order of exactly 32 bits of an unsigned integer n satisfying 0<=n<2^32. Return the resulting unsigned integer. Leading zeros are part of the fixed-width input and become trailing zeros. Do not stop early merely because the remaining source value becomes zero.
Examples
Example 1
reverse_32_bits(1)
=> 2147483648The least significant bit moves to the highest position.
Example 2
reverse_32_bits(0)
=> 0All 32 positions remain zero.
Example 3
reverse_32_bits(43261596)
=> 964176192The complete fixed-width reversal includes leading zeros.
Reveal the worked solution and reasoning
Why this mechanism works
Read the source from its least significant end and append each bit to a growing output by shifting the output left. After k steps, the low k bits of the original source have been read in reverse order. Completing all 32 steps moves the first-read bit into its required most significant position.
State and boundaries
After k iterations, answer is the reversal of the original low k bits within k positions; n has discarded those k bits by right shifts.
Protocol
- Initialize answer to zero.
- Repeat exactly 32 times.
- Shift answer left and append n&1.
- Shift n right.
- Return answer.
Visualization
32-bit source 000...0001
first bit read is 1; then 31 zeros
output 1000...0000 = 2147483648Python implementation
def reverse_32_bits(n):
answer = 0
for _ in range(32):
answer = (answer << 1) | (n & 1)
n >>= 1
return answer
Worked execution
reverse_32_bits(1)
L2 reverse_32_bits: answer = 0 n=1; answer=0 L3 reverse_32_bits: for _ in range(32): n=1; answer=0; _=0 L4 reverse_32_bits: answer = (answer << 1) | (n & 1) n=1; answer=1; _=0 L5 reverse_32_bits: n >>= 1 n=0; answer=1; _=0 L3 reverse_32_bits: for _ in range(32): n=0; answer=1; _=1 L4 reverse_32_bits: answer = (answer << 1) | (n & 1) n=0; answer=2; _=1 L3 reverse_32_bits: for _ in range(32): n=0; answer=2; _=2 L4 reverse_32_bits: answer = (answer << 1) | (n & 1) n=0; answer=4; _=2 ... 54 intermediate state changes omitted ... L3 reverse_32_bits: for _ in range(32): n=0; answer=536870912; _=30 L4 reverse_32_bits: answer = (answer << 1) | (n & 1) n=0; answer=1073741824; _=30 L3 reverse_32_bits: for _ in range(32): n=0; answer=1073741824; _=31 L4 reverse_32_bits: answer = (answer << 1) | (n & 1) n=0; answer=2147483648; _=31
Result: 2147483648. The least significant bit moves to the highest position.
reverse_32_bits(0)
L2 reverse_32_bits: answer = 0 n=0; answer=0 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=0 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=1 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=2 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=3 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=4 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=5 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=6 ... 21 intermediate state changes omitted ... L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=28 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=29 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=30 L3 reverse_32_bits: for _ in range(32): n=0; answer=0; _=31
Result: 0. All 32 positions remain zero.
Why the solution is correct
Each update appends the next source bit to the reversed processed prefix, preserving the k-bit invariant. After 32 iterations all source positions, including leading zeros, have been consumed; original bit i occupies output position 31-i.
Time and space
O(32)=O(1) time and O(1) storage under the fixed-width contract. Generalizing to width w uses O(w) bit-processing iterations.
Common mistakes
Looping only while n is nonzero loses leading-zero positions. Reversing a decimal string does not reverse the fixed-width binary representation.
Reasoning card
State: After k iterations, answer is the reversal of the original low k bits within k positions; n has discarded those k bits by right shifts.
Invariant: Processed source bits occupy their final reversed output positions.
Decision to rehearse: Read one bit at a time and place it in mirrored position.
Finish: Return answer
Transfer exercise
Reverse twice and prove the original 32-bit value is restored; use that property for randomized verification.