марта 14, 2009

Запаковка битов в free pascal.

Иногда, например при работе с файлами или написании низкоуровнего сетевого когда, может потребоваться работа с битами. Она без проблем реализуется с помощью побитовых операторов (and, not, shl, or), но хотелось бы более изящного решения.

По умолчанию конструкция вида
    TBits = packed record
       Carry: Boolean;
       Signed: Boolean;
       Zero: Boolean;
    end;
займет 3 байта. А если сверху прописать опцию

{$BITPACKING ON}

то эта запись будет занимать один байт, а работа с ней не будет отличаться от работы с обычной записью:
B: TBits;
...
B.Zero := True;
B.Signed := False;

К сожалению, fpc не поддерживает запаковку динамических массивов. Только константных, поэтому для реализации потока битов придется писать что-то типа
        Type
          TBits8 = packed array[0..7] Of Boolean;
        Var
          I: Integer;
          N: Integer; // размер
          Bits: Array Of TBits8; // поток битов
        ...
        N := 129; // хотим 129 бит
        SetLength(Bits, (N + 7) shr 3);
        for I := 0 to N - 1 do
          Bits[I shr 3][I and 7] := False; // бит с номером I устанавливаем в 0


Комментариев нет:

Отправить комментарий

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru