Иногда, например при работе с файлами или написании низкоуровнего сетевого когда, может потребоваться работа с битами. Она без проблем реализуется с помощью побитовых операторов (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
Комментариев нет:
Отправить комментарий