Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)

  Alt 22. Dez 2004, 15:06
Zitat von MaBuSE:
Zitat von Morlon:
ich hab mir grad mühevoll ein kleines Progi geschrieben mit dem ich Binär, Oktal, Dezimal und HexaDezimal umwandeln kann wie ich lustig bin.
Warum schreibst Du nicht eine Funktion, die von jeder Basis in jede Basis wandeln kann?

Wenn Du z.B. die Dezimalzahl 1347605150 in ein Zahlensystem der Basis 36 wandeln möchtest, dann würde das auch gehen. (Basis 36 = Ziffer 0..9 und A..Z -> 10 wäre dann also 36, 11 = 37, 0Z = 35, ...)

function X2Y(BaseX, BaseY: Byte; BaseXZahl: string):string; Falls jemand unbedingt eine Funktion Hex nach Bin bräuchte:
Delphi-Quellcode:
function hex2bin(hex:string):string;
begin
  Result := x2y(16, 2, hex);
end;
Das ist doch der einfachste Weg, oder?
So, ich habe mal eben schnell eine X2Y Funktion geschrieben:

Da ich keine Addition und Multiplikation für base2 bis base36 zur Verfügung habe,
mache ich den Umweg über das Dezimalsystem.
Die Zahlen werden erst von Basis X nach dec umgerechnet und danach von dec zu Basis Y.
Das war auf die schnelle der einfachste Weg (für mich)
Auserdem habe ich mich für IntPower entschieden (x hoch y), da es schneller geht als ein
a := b * b * b * b * ... * b; Kritik willkommen

Delphi-Quellcode:
uses math;

(*
// IntPower ist in der Unit Math von Delphi 7 enthalten
// Copyright (c) 1996, 2001 Borland Software Corporation
function IntPower(const Base: Extended; const Exponent: Integer): Extended;
asm
        mov    ecx, eax
        cdq
        fld1                      { Result := 1 }
        xor    eax, edx
        sub    eax, edx          { eax := Abs(Exponent) }
        jz      @@3
        fld    Base
        jmp    @@2
@@1:    fmul    ST, ST            { X := Base * Base }
@@2:    shr    eax,1
        jnc    @@1
        fmul    ST(1),ST          { Result := Result * X }
        jnz    @@1
        fstp    st                { pop X from FPU stack }
        cmp    ecx, 0
        jge    @@3
        fld1
        fdivrp                    { Result := 1 / Result }
@@3:
        fwait
end;
*)


// 22.12.2004 MaBuSE: X2Y wandelt in der BasisX angegebene Zahl nach BasisY um
// created for [url]www.delphipraxis.net[/url]
function X2Y(BaseX, BaseY: Byte; BaseXZahl: string):string;
const
  Ziffern = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
  i: Integer;
  Base10Zahl: Int64;
begin
  // Parameter in Ordnung ?
  Assert((BaseX<=36) and (BaseY<=36), 'Basis ist größer 36');
  BaseXZahl := UpperCase(BaseXZahl);
  i := Length(BaseXZahl);
  while (i>0) and (pos(BaseXZahl[i], copy(Ziffern, 1, BaseX))>0) do
  begin
    dec(i);
  end;
  Assert(i=0, 'BaseXZahl enhällt ungültige Ziffern');

  // Umrechnen BaseX nach dec
  Base10zahl := 0;
  for i := 1 to Length(BaseXZahl) do
  begin
    Base10Zahl := Base10zahl +
                  (Round(IntPower(BaseX, length(BaseXZahl)-i)) *
                  (Pos(BaseXZahl[i], Ziffern)-1));
  end;

  // Umrechnen dec nach BaseY
  Result := '';
  i := 0;
  while Base10Zahl >= IntPower(BaseY, i) do
  begin
    inc(i);
  end;
  while i>0 do
  begin
    Result := Result + Ziffern[Base10Zahl div Round(IntPower(BaseY, i-1))+1];
    Base10zahl := Base10Zahl mod Round(IntPower(BaseY, i-1));
    dec(i);
  end;
end;

// zum Test einfach einen Button aufs Formular ;-)
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Caption := X2Y(10, 36, '1347605150');
end;
Für die die dann doch einzelne Funktionen wollen:
Delphi-Quellcode:
// bin nach xxx
function bin2hex(bin:string):string;
begin
  Result := x2y(2, 16, bin);
end;

function bin2dec(bin:string):string;
begin
  Result := x2y(2, 10, bin);
end;

function bin2oct(bin:string):string;
begin
  Result := x2y(2, 8, bin);
end;

// oct nach xxx
function oct2hex(oct:string):string;
begin
  Result := x2y(8, 16, oct);
end;

function oct2dec(oct:string):string;
begin
  Result := x2y(8, 10, oct);
end;

function oct2bin(oct:string):string;
begin
  Result := x2y(8, 2, oct);
end;

// dec nach xxx
function dec2hex(dec:string):string;
begin
  Result := x2y(10, 16, dec);
end;

function dec2oct(dec:string):string;
begin
  Result := x2y(10, 8, dec);
end;

function dec2bin(dec:string):string;
begin
  Result := x2y(10, 2, dec);
end;

// hex nach xxx
function hex2dec(hex:string):string;
begin
  Result := x2y(16, 10, hex);
end;

function hex2oct(hex:string):string;
begin
  Result := x2y(16, 8, hex);
end;

function hex2bin(hex:string):string;
begin
  Result := x2y(16, 2, hex);
end;
So ich hoffe es hilft evtl jemanden
Viel Spaß

[edit]
ps: Ich habe mal ein kleines Beispielprogramm erzeugt. (Anhang)
[/edit]
Angehängte Dateien
Dateityp: zip beispbasex2basey_358.zip (206,2 KB, 142x aufgerufen)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat