1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| type
PCardinalBitTreeNode = ^TCardinalBitTreeNode;
TCardinalBitTreeNode = record
Childs: array[Boolean] of PCardinalBitTreeNode;
end;
TCardinalBitTreePath = array[0..31] of ByteBool;
function PathCardinal(Value: Cardinal): TCardinalBitTreePath;
const
BIT_MASK : array[0..31] of Cardinal =
(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536,
131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216,
33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648);
var
I: Byte;
begin
for I := 0 to 31 do
Result[I] := (Value and BIT_MASK[I]) = BIT_MASK[I];
end;
function FindCardinal(Root: PCardinalBitTreeNode; Value: Cardinal): Boolean;
var
Path: TCardinalBitTreePath;
I: Byte;
Node: PCardinalBitTreeNode;
begin
Result := False;
Path := PathCardinal(Value);
Node := Root;
for I := 0 to 31 do
begin
if not Assigned(Node) then
Exit;
Node := Node.Childs[Path[I]];
end;
Result := True;
end;
procedure SetCardinal(var Root: PCardinalBitTreeNode; Value: Cardinal);
var
Path: TCardinalBitTreePath;
I: Byte;
Parent: PCardinalBitTreeNode;
Node: PCardinalBitTreeNode;
begin
Path := PathCardinal(Value);
Parent := nil;
Node := Root;
for I := 0 to 31 do
begin
if not Assigned(Node) then
begin
New(Node);
ZeroMemory(Node, SizeOf(Node^));
if I > 0 then
Parent.Childs[Path[I - 1]] := Node
else
Root := Node
end;
// Next
Parent := Node;
Node := Node^.Childs[Path[I]];
end;
end;
procedure FreeTree(var Root: PCardinalBitTreeNode);
begin
if Assigned(Root) then
begin
FreeTree(Root.Childs[False]);
FreeTree(Root.Childs[True]);
Dispose(Root);
Root := nil;
end;
end; |
Partager