Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
Delphi 10 Seattle Enterprise
|
Re: Zahlen umwandeln (Bin, Oct, Dec, Hex)
22. Dez 2004, 16: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]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
|