![]() |
Ergänzung zu "Von beliebigem Zahlensystem in ein andere
Hi,
Ich wurde gerade gefragt, wie man z.B. Zahlen aus dem Dezimalsystem ins Hexadezimalsystem konvertiert. Darauf hat mich der Ehrgeiz gepackt und ich habe aus Eigeninteresse versucht Zahlen zwischen beliebigen Zahlensystemen hin und herzukonvertieren. Das was rauskam, war meines Erachtens einen CodeLib Beitrag Wert. Allerdings hab ich gesehn, dass glkgereon da schon was gepostet hatte. Aber da ich mit nur 2 Funktionen auskomme und mein Code sich sonst auch mehr oder weniger stark von glkgereons Code unterscheidet, wollte ich meinen auch mal posten. Link zum CodeLib Beitrag: ![]()
Delphi-Quellcode:
Das wars dann auch erstmal ;)
uses Math;
function BaseToDec(Value: String; Base: Byte): Int64; var tmp: Byte; i: Integer; begin Result := 0; for i:= Length(Value) downto 1 do begin tmp := Ord(Value[i]); if tmp in [$30..$39] then tmp := tmp - $30 else tmp := 9 + (tmp-$40); Result := Result + (tmp*Round(IntPower(Base,Length(Value)-i))); end; end; function ConvertNumber(Value: String; SrcBase,DestBase: Byte): String; var nr,old: Int64; tmp: Byte; begin if (not (SrcBase in [2..36])) or (not (DestBase in [2..36])) then exit; nr := BaseToDec(Value,SrcBase); repeat old := nr; nr := old div DestBase; tmp := old mod DestBase; if tmp > 9 then Result := Chr($40+tmp-9) + Result else Result := IntToStr(tmp) + Result; until nr = 0; end; Edit: Hatte doch auch was zu Phantom1s Funktion geschrieben o.O Naja dann halt noch nachträglich. Habe die bei einer Foren Suche entdeckt und wollte sie auch mal erwähnt haben. Die Funktion wurde wie gesagt von Phantom1 gepostet. Ob Sie ursprünglich von Phantom1 stammt, weiß ich nicht:
Delphi-Quellcode:
Gruß
function BaseToBase(Value: string; StartBase, EndBase: byte): string;
const Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var i: Integer; dez, j: Int64; begin Result:=''; if (StartBase<2) or (StartBase>36) or (EndBase<2) or (EndBase>36) then Exit; for i:=1 to Length(Value) do begin j:=Pos(Value[i], Digits); if (j>StartBase) or (j=0) then Exit; end; j:=1; dez:=0; for i:=Length(Value) downto 1 do begin dez:=dez + (Pos(Value[i], Digits)-1) * j; j:=j*StartBase; end; repeat Result:=Digits[dez mod EndBase+1] + Result; dez:=dez div EndBase; until dez=0; end; Neutral General |
Re: Ergänzung zu "Von beliebigem Zahlensystem in ein an
Ich hätte da eine Vereinfachung:
Delphi-Quellcode:
Ungetestet, aber es ist im Prinzip das Horner Schema.
// Alt
Result := Result + (tmp*Round(IntPower(Base,Length(Value)-i))); // Neu Result := Result * base + tmp; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz