diff --git a/UBigInt.pas b/UBigInt.pas index a49ea16..5a31b72 100644 --- a/UBigInt.pas +++ b/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;