对于总是除以10(每条评论)的特殊情况,您可以执行以下操作:
procedure DivMod10(num : Cardinal; var q, r : Cardinal); inline; var rl : uInt64; begin rl := UInt64(3435973837)*num; q := rl shr 35; r := num - q*10; end;
算法因分母而异,但确定它的来源和幻数可以在libdivide中找到.这对于所有无符号32位整数都是准确的,并且比使用div
(并提供余数)快约3倍.
基准(优化):
t0 := GetTickCount; for I := 1 to 999999999 do begin DivMod10(i, q, r); end; ShowMessage(IntToStr(GetTickCount - t0)); // result : 1809 t0 := GetTickCount; for I := 1 to 999999999 do begin q := i div 10; end; ShowMessage(IntToStr(GetTickCount - t0)); // result : 5336
测试:
for I := 1 to High(Cardinal) do begin DivMod10(i,q,r); if q <> (i div 10) then WriteLn(IntToStr(i)); // no mismatch found end;