program ZeroBitsEveryStep;
{$mode objfpc}{$H+}
{
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(number, step: LongInt): LongInt;
var
pos: Integer;
mask: LongInt;
resultValue: LongInt;
begin
resultValue := number;
pos := 0;
while pos < 32 do
begin
mask := 1 shl pos;
{ If the bit is 1, zero it }
if (resultValue and mask) <> 0 then
resultValue := resultValue and (not mask);
pos := pos + step;
end;
zeroBitsEveryStep := resultValue;
end;
{
printBinary(n)
--------------
Prints a 32-bit binary representation of an integer.
}
procedure printBinary(n: LongInt);
var
i: Integer;
bit: Integer;
begin
for i := 31 downto 0 do
begin
bit := (n shr i) and 1;
Write(bit);
if (i mod 4 = 0) then
Write(' ');
end;
end;
var
number: LongInt;
step: Integer;
resultValue: LongInt;
begin
number := 536870911; { 0001 1111 1111 1111 1111 1111 1111 1111 }
step := 3; { zero bits 0, 3, 6, 9, ... }
WriteLn('Original number in binary:');
printBinary(number);
resultValue := zeroBitsEveryStep(number, step);
WriteLn;
WriteLn;
WriteLn('Number after zeroing every ', step, ' bits (only if bit was 1):');
printBinary(resultValue);
WriteLn;
WriteLn;
WriteLn('Result as integer: ', resultValue);
end.
{
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
}