вот код из А2 для BitSets, где data = POINTER TO ARRAY OF SET
PROCEDURE SetBit* (pos: LONGINT; value: BOOLEAN);
BEGIN
ASSERT (pos >= 0); ASSERT (pos < size);
IF value THEN
INCL (data[pos DIV Elements], pos MOD Elements);
ELSE
EXCL (data[pos DIV Elements], pos MOD Elements);
END;
END SetBit;
PROCEDURE GetBit* (pos: LONGINT): BOOLEAN;
BEGIN
ASSERT (pos >= 0); ASSERT (pos < size);
RETURN pos MOD Elements IN data[pos DIV Elements];
END GetBit;
PROCEDURE SetBits* (startPos, bits, value: LONGINT);
VAR adr: SYSTEM.ADDRESS;
BEGIN
ASSERT (startPos >= 0); ASSERT (startPos+bits <= size);
IF (bits = 8) & (startPos MOD 8 = 0) THEN
adr := SYSTEM.ADR(data[0])+startPos DIV 8;
SYSTEM.PUT(adr, CHR(value));
ELSE
WHILE bits > 0 DO
SetBit (startPos, ODD (value)); value := value DIV 2;
INC(startPos); DEC(bits)
END;
WHILE bits < 0 DO
SetBit (startPos, ODD (value)); value := value DIV 2;
DEC(startPos); INC(bits)
END;
END;
END SetBits;