How to zero every n-bit from a number if that bit is 1 in PHP

1 Answer

0 votes
/*
    zeroBitsEveryStep(number, step)
    -------------------------------
    Zeros every `step`-th bit (0-based from LSB)
    but only if that bit is currently 1.

    Example:
        number = 536870911
        step = 3  → zero bits 0, 3, 6, 9, ...
*/
function zeroBitsEveryStep(int $number, int $step): int
{
    $result = $number;

    for ($pos = 0; $pos < 32; $pos += $step) {

        $mask = 1 << $pos;

        // If the bit is 1, zero it
        if (($result & $mask) !== 0) {
            $result &= ~$mask;
        }
    }

    return $result;
}

/*
    printBinary(n)
    --------------
    Prints a 32-bit binary representation of an integer.
*/
function printBinary(int $n): void
{
    $s = str_pad(decbin($n), 32, "0", STR_PAD_LEFT);

    for ($i = 0; $i < 32; $i++) {
        echo $s[$i];
        if (($i + 1) % 4 === 0) echo " ";
    }
}

$number = 536870911;   // 0001 1111 1111 1111 1111 1111 1111 1111
$step   = 3;           // zero bits 0, 3, 6, 9, ...

echo "Original number in binary:\n";
printBinary($number);

$result = zeroBitsEveryStep($number, $step);

echo "\n\nNumber after zeroing every $step bits (only if bit was 1):\n";
printBinary($result);

echo "\n\nResult as integer: $result\n";



/*
run:

Original number in binary:
0001 1111 1111 1111 1111 1111 1111 1111 

Number after zeroing every 3 bits (only if bit was 1):
0001 0110 1101 1011 0110 1101 1011 0110 

Result as integer: 383479222

*/

 



answered 16 hours ago by avibootz
...