在DELPHI中,如果您的域是整数,并且如果您可以将参数适配为longints,并且如果您可以避免传递最小整数($80000000),那么这将给您所需的结果而不需要任何条件分支:
function cmMinInt( XX, YY, ZZ : longint ) : longint;
begin
result := max(0,longint(
min(longint((XX-1) xor $80000000),
min(longint((YY-1) xor $80000000),
longint((ZZ-1) xor $80000000)
)) xor $80000000)+1);
end;
该技术依赖于长整型的可逆无损重映射,以使我们感兴趣的范围——从1到MAXINT的整数保持有序并占据最低值。简单地切换符号位几乎可以得到我们需要的结果,除了我们不想在较低范围内包括0。先减去1(然后再加回来)就可以解决这个问题。这里使用的异或运算扩展了两个操作数到int64,这需要一个显式转换回longint,以便min函数产生正确的结果。最后,如果所有操作数都为负,最小值将在上限范围内找到,并且答案将为负。在这种情况下,我们希望答案为0,因此我们只需使用max函数进行截取即可。
以下是相同的数学公式,为了更易读而分成多个语句:
function cmMinInt( XX, YY, ZZ : longint ) : longint;
begin
XX := XX-1;
XX := XX xor $80000000;
XX := longint(XX);
YY := longint((YY-1) xor $80000000);
ZZ := longint((ZZ-1) xor $80000000);
result := min(XX,min(YY,ZZ));
result := result xor $80000000;
result := result+1;
result := longint(result);
result := max(0,result);
end;
-阿尔.