Problem#
Create a word with a single 1
-bit at the position of the rightmost 0
-bit in an unsigned word x
. If the input is all 1
s, the output should be 0
.
Examples#
Example 1#
1
2
3
Input: x = 0b01011011
Output: 0b00000100
Explanation: the rightmost `0` in `x` ( from LSB) is at position 2 ; result has a single `1` at that position.
Similar Problems
Solution#
Method 1 – Bit trick: ~x & (x + 1)
#
Intuition#
x + 1
sets the rightmost 0
bit of x
to 1
and clears the 1
bits to its right. The complement ~x
has 1
where x
has 0
. AND-ing ~x
and (x + 1)
leaves a single 1
at the rightmost 0
position and clears other bits. If x
is all 1
s, (x + 1)
overflows to 0
(for fixed-width unsigned words) and the result is 0
.
Approach#
Treat x
as an unsigned word of width w
(machine word or explicit width).
Compute res = (~x) & (x + 1)
.
If using unbounded integers (Python), mask with mask = (1 << w) - 1
to restrict to w
bits: res & mask
.
Edge cases#
If x
has no zero bits (all ones), (x + 1)
wraps to 0
and res
becomes 0
.
Use unsigned types to avoid undefined or implementation-defined signed behavior in languages like C/C++.
Dry Run#
1
2
3
4
x = 01011011
~ x = 10100100
x + 1 = 01011100
~ x | (x + 1 ) = 00000100
Code#
Cpp
Go
Java
Python
1
2
3
4
5
6
class Solution {
public :
unsigned singleOneAtRightmostZero(unsigned x) {
return (~ x) & (x + 1u );
}
};
1
2
3
4
5
package main
func SingleOneAtRightmostZero (x uint ) uint {
return ^x & (x + 1 )
}
1
2
3
4
5
class Solution {
public int singleOneAtRightmostZero (int x) {
return (~ x) & (x + 1);
}
}
1
2
3
4
class Solution :
def single_one_at_rightmost_zero (self, x: int, width: int = 32 ) -> int:
mask = (1 << width) - 1
return ((~ x) & (x + 1 )) & mask
Complexity#
⏰ Time complexity: O(1)
— constant-time bitwise operations.
🧺 Space complexity: O(1)
.