Evo ja sam tu nesto kuckao pa mozda ti pomogne:
Pakovanje 8 booleana u 1 bajt.
U proceduri button1click je primer kako se koristi tako spakovan niz.
Sad bi mogao da imas i milijardu booleana spakovanih u milijardu/8 bajtova
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls;
const
bitovi: array[0..7] of byte = (254, 253,251,247,239,223,191, 127);
type
niz=array [0..100000000] of byte;
pniz=^niz;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
P: pniz;
YDim: Integer;
Size: Integer;
implementation
{$R *.dfm}
procedure DimBoolean(var p: pniz; X, Y: Integer);
begin
YDim := Y;
Size := ((x*y) div 8)+1;
getmem(p, Size);
fillchar(p^, Size, 0);
end;
procedure SetBoolean(p:pniz; x,y:integer; value: Boolean);
var
b,i,j: Integer;
begin
b := (x*ydim+y);
i := b div 8;
j := b mod 8;
if value then
p^[i] := p^[i] or (1 shl j)
else
p^[i] := p^[i] and bitovi[j];
end;
function GetBoolean(p:pniz; x,y:integer): boolean;
var
b,i,j: integer;
begin
b := (x*ydim+y);
i := b div 8;
j := b mod 8;
Result := (p^[i] and (1 shl j)) > 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
b:boolean;
begin
DimBoolean(P,10,10);
for i := 0 to 9 do
for j := 0 to 9 do
SetBoolean(P,i,j, True);
for i := 0 to 9 do
for j := 0 to 9 do
begin
b:=GetBoolean(P,i,j);
setboolean(P,i,j,not b);
end;
FreeMem(P);
end;
end.