#include <iostream>
#include <cstdint>
#include <bitset>
/*
findNthSetBit32:
----------------
Given:
- x : a 32-bit integer
- n : which set bit to find (1-based index)
Returns:
A 32-bit mask with ONLY the Nth set bit of x turned on.
If n is larger than the number of set bits, returns 0.
Algorithm:
- Use std::countr_zero to locate the lowest set bit.
- Remove that bit using x &= (x - 1).
- When we reach the Nth one, return 1u << index.
*/
// Find the Nth set bit (1-based) in a 32-bit integer.
// Returns a mask with ONLY that bit set, or 0 if not enough bits.
std::uint32_t findNthSetBit32(std::uint32_t x, unsigned n)
{
// Loop while there are still set bits remaining in x
while (x != 0) {
// std::countr_zero(x) returns the number of trailing zeros,
// which is the index (0–31) of the lowest set bit.
unsigned index = std::countr_zero(x);
// Decrement n; if this was the Nth set bit, return a mask
// with ONLY that bit set: (1 << index)
if (--n == 0)
return 1u << index;
// Remove the lowest set bit from x.
// Trick: x & (x - 1) clears the least significant 1-bit.
x &= (x - 1);
}
// If we exit the loop, x had fewer than n set bits.
return 0;
}
int main()
{
std::uint32_t value =
0b00001101001101101100100010100000u;
unsigned n = 4;
std::uint32_t result = findNthSetBit32(value, n);
std::cout << "Input value: " << std::bitset<32>(value) << "\n";
std::cout << "N = " << n << "\n";
std::cout << "Result mask: " << std::bitset<32>(result) << "\n";
}
/*
run:
Input value: 00001101001101101100100010100000
N = 4
Result mask: 00000000000000000100000000000000
*/