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

1 Answer

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

}



 



answered 17 hours ago by avibootz
...