AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Ergänzung zu "Von beliebigem Zahlensystem in ein anderes"
Thema durchsuchen
Ansicht
Themen-Optionen

Ergänzung zu "Von beliebigem Zahlensystem in ein anderes"

Ein Thema von Neutral General · begonnen am 21. Aug 2008 · letzter Beitrag vom 21. Aug 2008
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Ergänzung zu "Von beliebigem Zahlensystem in ein andere

  Alt 21. Aug 2008, 21:54
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Ergänzung zu "Von beliebigem Zahlensystem in ein an

  Alt 21. Aug 2008, 23:10
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 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