Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi BigInt div 2 mittels shr 1 (https://www.delphipraxis.net/191025-bigint-div-2-mittels-shr-1-a.html)

Bjoerk 30. Nov 2016 18:58

Delphi-Version: 2007

BigInt div 2 mittels shr 1
 
Ich hab eine BigInt, die liegt in Blöcken vor. Ich wollte die Zahl durch 2 teilen.
Bekomme aber immer "Fehler bei Bereichsprüfung". Kennt sich da jemand aus?
Delphi-Quellcode:
procedure TMemoForm.Button2Click(Sender: TObject);
var
  Result: TIntegerDynArray;
  Temp: UInt64;
  I, Count: integer;
  S: string;
begin
  // 315901256781234 div 2 = ..
  Count := 4;
  SetLength(Result, 4);
  Result[0] := 1234;
  Result[1] := 5678;
  Result[2] := 9012;
  Result[3] := 315;
  Temp := 0;
  S := '';
  // shr 1
  for I := Count - 1 downto 0 do
  begin
    Temp := (UInt64(Result[I]) shl UInt64(31)) or (Temp shl UInt64(32)); // *** hier
    Result[I] := Temp shr UInt64(32);
    S := IntToStr(Result[I]) + S;
  end;
  MemoB.Lines.Add(S);
end;

Der schöne Günther 30. Nov 2016 19:20

AW: BigInt div 2 mittels shr 1
 
Nach dem zweiten Durchlauf ist bei mir

Temp=9223391389977411584

Und
Temp shr UInt64(32)=2147488154

und das passt nicht mehr in dein Integer-Array. Ein Integer kann maximal 2147483647 groß sein.

Fritzew 30. Nov 2016 19:39

AW: BigInt div 2 mittels shr 1
 
Schalte mal die Bereichsprüfung aus also:

Delphi-Quellcode:
 for I := Count - 1 downto 0 do
  begin
  {$R-}
    Temp := (UInt64(Result[I]) shl UInt64(31)) or (Temp shl UInt64(32)); // *** hier
    Result[I] := Temp shr UInt64(32);
    S := IntToStr(Result[I]) + S;
  end;
Dein Problem ist aber denke ich etwas anderes......
Die Fehlermeldung bekommst Du so auf jeden Fall weg


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz