/*
countTrailingZeros:
-------------------
Returns the number of trailing zeros in a 32‑bit integer.
Equivalent to C++ std::countr_zero or GCC __builtin_ctz.
Assumes $x != 0.
Algorithm:
- Scan upward from the least significant bit.
- Shift right until the lowest bit becomes 1.
*/
function countTrailingZeros(int $x): int {
$i = 0;
while (($x & 1) === 0) {
$x >>= 1;
$i++;
}
return $i;
}
/*
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 countTrailingZeros($x) to locate the lowest set bit.
- Remove that bit using $x &= ($x - 1).
- When we reach the Nth one, return 1 << $index.
*/
function findNthSetBit32(int $x, int $n): int {
while ($x !== 0) {
// Index (0–31) of the lowest set bit
$index = countTrailingZeros($x);
// If this is the Nth set bit, return mask
if (--$n === 0) {
return 1 << $index;
}
// Remove the lowest set bit
$x &= ($x - 1);
}
// Fewer than n set bits
return 0;
}
/*
toBinary32:
-----------
Convert a 32-bit integer to a padded binary string.
*/
function toBinary32(int $x): string {
$s = decbin($x);
return str_pad($s, 32, '0', STR_PAD_LEFT);
}
// --------------------
// Main
// --------------------
$value = 0b00001101001101101100100010100000;
$n = 4;
$result = findNthSetBit32($value, $n);
echo "Input value: " . toBinary32($value) . PHP_EOL;
echo "N = $n" . PHP_EOL;
echo "Result mask: " . toBinary32($result) . PHP_EOL;
/*
run:
Input value: 00001101001101101100100010100000
N = 4
Result mask: 00000000000000000100000000000000
*/