Problem# Given a non-negative integer n, find the position of its rightmost set bit (least-significant 1) in its binary representation.
Positions in this page are 1-based (i.e., the least-significant bit has position 1).
Examples# Example 1# 1
2
Input: n = 1
Output: 1
Example 2# 1
2
Input: n = 6 # 0b110
Output: 2
Example 3# 1
2
Input: n = 11 # 0b1011
Output: 1
Example 4# 1
2
Input: n = 24 # 0b11000
Output: 4
Similar Problems Solution# Below are three common approaches to obtain the rightmost set bit (either its value as a mask, or its 1-based position).
Intuition# The expression n & -n isolates the lowest set bit as a mask (a power of two). For example, if n = 0b10110, then n & -n = 0b10.
Approach# If n == 0 there is no set bit; return a sentinel (e.g., 0 for mask or -1 for position). Compute mask = n & -n (two’s complement arithmetic). To get the 1-based position from mask, compute the index of that single set bit. Edge cases:
n == 0 → return -1 (position) or 0 (mask).Code#
Cpp
Go
Java
Python
1
2
3
4
5
6
7
8
9
class Solution {
public :
// returns 1-based position of rightmost set bit, or -1 if none
int rightmost_pos(unsigned int n) {
if (n == 0 ) return - 1 ;
unsigned int mask = n & - static_cast < int > (n);
return __builtin_ctz (mask) + 1 ; // ctz = count trailing zeros (0-based)
}
};
1
2
3
4
5
6
7
8
9
package main
import "math/bits"
func RightmostPos (n uint32 ) int {
if n == 0 { return - 1 }
mask := n & - n
return bits .TrailingZeros32 (mask ) + 1
}
1
2
3
4
5
6
7
class Solution {
public int rightmostPos (int n) {
if (n == 0) return - 1;
int mask = n & - n;
return Integer.numberOfTrailingZeros (mask) + 1;
}
}
1
2
3
4
5
6
7
class Solution :
def rightmost_pos (self, n: int) -> int:
if n == 0 :
return - 1
mask = n & - n
# bit_length() on a power-of-two gives the 1-based index
return mask. bit_length()
Complexity# ⏰ Time complexity: O(1) — constant-time bit operations on fixed-size words. 🧺 Space complexity: O(1). Method 2 — Right-shift scan# Intuition# Scan bits from LSB to MSB until you encounter a 1; count how many shifts were required.
Approach# If n == 0 return -1. Initialize pos = 1. While (n & 1) == 0: n >>= 1, pos += 1. Return pos when (n & 1) == 1. Code#
Cpp
Go
Java
Python
1
2
3
4
5
6
7
8
9
class Solution {
public :
int rightmost_pos_scan(unsigned int n) {
if (n == 0 ) return - 1 ;
int pos = 1 ;
while ((n & 1u ) == 0u ) { n >>= 1 ; ++ pos; }
return pos;
}
};
1
2
3
4
5
6
7
8
9
func RightmostPosScan (n uint ) int {
if n == 0 { return - 1 }
pos := 1
for (n & 1 ) == 0 {
n >>= 1
pos ++
}
return pos
}
1
2
3
4
5
6
7
8
class Solution {
public int rightmostPosScan (int n) {
if (n == 0) return - 1;
int pos = 1;
while ((n & 1) == 0) { n >>= 1; pos++ ; }
return pos;
}
}
1
2
3
4
5
6
7
8
9
class Solution :
def rightmost_pos_scan (self, n: int) -> int:
if n == 0 :
return - 1
pos = 1
while (n & 1 ) == 0 :
n >>= 1
pos += 1
return pos
Complexity# ⏰ Time complexity: O(b) where b is the index of the first set bit (worst-case word size). 🧺 Space complexity: O(1). Method 3 — Using logarithm on the isolated mask (not recommended)# Intuition# If you isolate the rightmost set bit as mask = n & -n, then its position equals 1 + log2(mask). This uses floating-point math and may be prone to rounding errors; builtins are preferred.
Approach# Compute mask = n & -n. Compute position as 1 + floor(log2(mask)) (or log2(mask) with careful rounding). Code#
Cpp
Java
Python
1
2
3
4
5
int rightmost_pos_log (unsigned int n) {
if (n == 0 ) return - 1 ;
unsigned int mask = n & - static_cast < int > (n);
return 1 + static_cast < int > (std:: log2(mask));
}
1
2
3
4
5
int rightmostPosLog (int n) {
if (n == 0) return - 1;
int mask = n & - n;
return 1 + (int )(Math.log (mask) / Math.log (2));
}
1
2
3
4
5
6
def rightmost_pos_log (n: int) -> int:
if n == 0 :
return - 1
mask = n & - n
from math import log2
return 1 + int(log2(mask))
Complexity# ⏰ Time complexity: O(1) (but uses floating-point ops). 🧺 Space complexity: O(1). Notes & References# Prefer Method 1 (bit trick) or platform builtins (ctz / TrailingZeros) for correctness and speed. Original article and a sample implementation are listed in source_links in the frontmatter.