Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Ergänzung zu "Von beliebigem Zahlensystem in ein anderes" (https://www.delphipraxis.net/119192-ergaenzung-zu-von-beliebigem-zahlensystem-ein-anderes.html)

Neutral General 21. Aug 2008 20:54


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: *klick*

Delphi-Quellcode:
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;
Das wars dann auch erstmal ;)

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:
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;
Gruß
Neutral General

sx2008 21. Aug 2008 22:10

Re: Ergänzung zu "Von beliebigem Zahlensystem in ein an
 
Ich hätte da eine Vereinfachung:
Delphi-Quellcode:
// Alt
Result := Result + (tmp*Round(IntPower(Base,Length(Value)-i)));

// Neu
Result := Result * base + tmp;
Ungetestet, aber es ist im Prinzip das Horner Schema.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 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