Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahlen umwandeln (Bin, Oct, Dec, Hex) (https://www.delphipraxis.net/36046-zahlen-umwandeln-bin-oct-dec-hex.html)

Morlon 15. Dez 2004 14:39

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also hier der überarbeitete Quelltext mit vielem Kommentaren, damit auch jeder versteht was gemacht wird ;)

Grüße
Elmar

Gollum 15. Dez 2004 14:46

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

Zitat:

Zitat von Morlon
... Result := arrHex[ZwErgInt] + Result; ...

geht so:
Delphi-Quellcode:
Result := arrHex[Trunc(ZwErgInt)] + Result;

Oxmyx 15. Dez 2004 15:37

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
Delphi-Quellcode:
procedure ArrClear(PArr: typBin);
var i: integer;
begin
  for i := 1 to 100 do arrBin[i] := False;
end;
geht viel schneller:

Delphi-Quellcode:
ZeroMemory(@arrBin, sizeof(arrBin));

Gollum 16. Dez 2004 06:47

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

statt
Zitat:

Zitat von Oxmyx
ZeroMemory(@arrBin, sizeof(arrBin));

kann man auch
Delphi-Quellcode:
FillChar(arrBin, SizeOf(arrBin), 0);
verwenden, da ZeroMemory auch nichts anderes macht.

Morlon 22. Dez 2004 12:37

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
huch, falscher Knopf, bitte löschen. :shock:

MaBuSE 22. Dez 2004 14:07

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

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, ...)

Delphi-Quellcode:
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?

MaBuSE 22. Dez 2004 14:48

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

Zitat von MaBuSE
die Dezimalzahl 1347605150 in ein Zahlensystem der Basis 36 wandeln

(Anmerkung: dec = Dezimales Zahlensstem = das mit dem wir rechnen)

In Base36 gibt es die Ziffern:
Code:
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
G = 16
H = 17
I = 18
J = 19
K = 20
L = 21
M = 22
N = 23
O = 24
P = 25
Q = 26
R = 27
S = 28
T = 29
U = 30
V = 31
W = 32
X = 33
Y = 34
Z = 35
Zahlen werden wie folgt zusammengesetzt:
Code:
2X3 in Base36 

2X3
= 2 * 36^2 + 33 * 36^1 + 3 * 36^0 (in dec)
= 3888 + 1188 + 3 (in dec)
= 5079 (in dec)
Hier noch mal die Umrechnungstabelle
Code:
36^0 = 1
36^1 = 36
36^2 = 1296
36^3 = 46656
36^4 = 1679616
36^5 = 60466176
Beispiel: 1347605150 (dec) nach Base36
Code:
MABUSE (base32)
= 22 * 36^5 + 10 * 36^4 + 11 * 36^3 + 30 * 36^2 + 28 * 36^1 + 14 * 36^0 (in dec)
= 1330255872 + 16796160 + 513216 + 38880 + 1008 + 14 (in dec)
= 1347605150 (in dec)

Helmi 22. Dez 2004 14:53

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

das ist ja ein ganz nettes Programm!! :thumb:

Nur... - da hat sich wohl der Fehlerteufel ein wenig eingeschlichen (siehe Anhang) :coder2:

Wenn ich damals in meiner Ausbildung richtig aufgepasst hab dann gibts Binär die Zahl "4" nicht.

mfg
Helmi

[edit]Huch - Attachment vergessen! - Das blöde Alter :wink: [/edit]

MaBuSE 22. Dez 2004 15:06

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MaBuSE
Zitat:

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, ...)

Delphi-Quellcode:
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
Delphi-Quellcode:
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]

Morlon 31. Dez 2004 01:44

Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
 
Ich hatte das Progi unter Open-Source hinzugefügt, und da hat doch glatt jemand ein kleines Progi geschrieben (und es ist wirklich klein) dass Dezimal in alles umwandeln kann.

Kuckst du hier :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 2 von 2     12   

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