Int64Rec
from 类型SysUtils
是为挑选 64 位整数部分的任务而设计的。
如果您碰巧使用的是早于该类型的 Delphi,请自行定义:
type
Int64Rec = packed record
case Integer of
0: (Lo, Hi: Cardinal);
1: (Cardinals: array [0..1] of Cardinal);
2: (Words: array [0..3] of Word);
3: (Bytes: array [0..7] of Byte);
end;
更重要的是,您只需要一个函数,该函数返回 -1 表示小于,1 表示大于,0 表示等于。像这样的东西:
function CompareUInt64(const i, j: Int64): Integer;
begin
if Int64Rec(i).Hi < Int64Rec(j).Hi then
Result := -1
else if Int64Rec(i).Hi > Int64Rec(j).Hi then
Result := 1
else if Int64Rec(i).Lo < Int64Rec(j).Lo then
Result := -1
else if Int64Rec(i).Lo > Int64Rec(j).Lo then
Result := 1
else
Result := 0;
end;
这个想法是你首先比较高阶部分,只有当它相等时,你才会继续比较低阶部分。
这可以通过比较函数来简化Cardinal
。
function CompareCardinal(const i, j: Cardinal): Integer;
begin
if i < j then
Result := -1
else if i > j then
Result := 1
else
Result := 0;
end;
function CompareUInt64(const i, j: Int64): Integer;
begin
Result := CompareCardinal(Int64Rec(i).Hi, Int64Rec(j).Hi);
if Result = 0 then
Result := CompareCardinal(Int64Rec(i).Lo, Int64Rec(j).Lo);
end;
最后,如果您需要问题的布尔函数,可以在这个更通用的函数之上实现它们。