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