Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Semrush - keyword research tool

Turn ChatGPT, Claude, Gemini, And CoPilot Into Your Personal Assistant, Business Coach, Content Creator, And More

AFFILIATE MARKETING Your all-in-one performance engine Manage affiliates, creators, and customer referrals in one unified platform—turning every partnership into measurable growth
Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

42,641 questions

55,376 answers

573 users

How to find the Nth set bit in a 32‑bit integer with PHP

1 Answer

0 votes
/*
    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

*/

 



answered Jul 25 by avibootz
...