Merge branch 'bigint' into day24-analytical
This commit is contained in:
commit
d503968cee
29
UBigInt.pas
29
UBigInt.pas
|
@ -78,6 +78,8 @@ type
|
|||
class property Zero: TBigInt read GetZero;
|
||||
function CompareTo(constref AOther: TBigInt): Integer;
|
||||
function TryToInt64(out AOutput: Int64): Boolean;
|
||||
// TODO: ToString is currently for debug output only.
|
||||
function ToString: string;
|
||||
class function FromInt64(const AValue: Int64): TBigInt; static;
|
||||
class function FromHexadecimalString(const AValue: string): TBigInt; static;
|
||||
class function FromBinaryString(const AValue: string): TBigInt; static;
|
||||
|
@ -237,10 +239,17 @@ class function TBigInt.SubtractAbsoluteValues(constref AA, AB: TBigInt; const AR
|
|||
var
|
||||
a, b: TBigInt;
|
||||
carry: Cardinal;
|
||||
i, j, lastNonZeroDigitIndex, len: Integer;
|
||||
compare, i, j, lastNonZeroDigitIndex, len: Integer;
|
||||
begin
|
||||
// Establishes the operand order, such that Abs(a) is not less than Abs(b).
|
||||
if (AA.CompareToAbsoluteValues(AB) >= 0) then
|
||||
compare := AA.CompareToAbsoluteValues(AB);
|
||||
if compare = 0 then
|
||||
begin
|
||||
Result := Zero;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if compare > 0 then
|
||||
begin
|
||||
a := AA;
|
||||
b := AB;
|
||||
|
@ -491,6 +500,21 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TBigInt.ToString: string;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
if FIsNegative then
|
||||
Result := '-'
|
||||
else
|
||||
Result := '';
|
||||
for i := 0 to Length(FDigits) - 2 do
|
||||
Result := Result + '(' + IntToStr(FDigits[i]) + ' + 2^32 * ';
|
||||
Result := Result + IntToStr(FDigits[Length(FDigits) - 1]);
|
||||
for i := 0 to Length(FDigits) - 2 do
|
||||
Result := Result + ')';
|
||||
end;
|
||||
|
||||
class function TBigInt.FromInt64(const AValue: Int64): TBigInt;
|
||||
var
|
||||
absVal: Int64;
|
||||
|
@ -565,7 +589,6 @@ begin
|
|||
Result := TBigInt.MultiplyAbsoluteValues(A, B, A.IsNegative <> B.IsNegative);
|
||||
end;
|
||||
|
||||
// TODO: Shift operator could be implemented with a single Move call, but I do not want to change it without test cases.
|
||||
operator shl(const A: TBigInt; const B: Integer): TBigInt;
|
||||
var
|
||||
i, j, digitShifts, bitShifts, reverseShift, len, newLength: Integer;
|
||||
|
|
Loading…
Reference in New Issue