Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   bräuchte mal unterstützung (Zahlensysteme) (https://www.delphipraxis.net/91682-braeuchte-mal-unterstuetzung-zahlensysteme.html)

Sharack 8. Mai 2007 16:53


bräuchte mal unterstützung (Zahlensysteme)
 
Hi, ich habe folgendes Problem.
Ich möchte eine Integer Zahl konvertieren, Ausgabe soll erstemal eine Festpunktzahl 32Bits sein, die dann als interne Darstellung als sedezimal und als binäre Zahl ausgegeben werden soll.

Mein Code für die Umwandlung in Hex ist ja noch ganz einfach.
Delphi-Quellcode:
if RadioButtonInteger.Checked
      then begin a := StrToInt(MaskEditEingabeInt.Text);
      EditAusgabeHex.text := IntToHex(StrToInt(MaskEditEingabeInt.Text),8);
wird also zb. die Zahl 123 eingegeben, kommt als sedezimalzahl = 0000007B heraus.
Nun möchte ich diesen Wert benutzen und für jede Ziffer zb. 7 die Binäre darstellung zuordnen.

Beispiel:

7 := 0 1 1 1 + ' ' // plus ein Lehrzeichen für bessere Übersicht.

Das habe ich zuerst durch eine case of anweisung versucht, jedoch sind dort strings ja untersagt, also versuchte ich das mit einer If anweisung und jetzt hapert es.. ich bin einfach noch nicht all zu lange dabei, so kann ich das ohne eure Hilfe leider nicht fertigstellen.

Kann mir da einer von euch vielleicht einen kleinen Tipp geben? Ich hoffe ich habe mich klar ausdrücken können.
Später soll dann noch das ganze mit Realtypen im eingabeformat und IBM/390 LOng Real 64Bits; IBM/390 Extended 128Bits ; IEEE Long Real 64 Bits ; IEEE Extended Real 80 Bits im Ausgabetyp erweiter werden.

Ich freue mich auf jede unterstützung!

MFG

Marco

SirThornberry 8. Mai 2007 17:30

Re: bräuchte mal unterstützung (Zahlensysteme)
 
Hallo Sharack, willkommen in der DP :dp:
Könntest du bitte den Titel ändern, Hilfe/Unterstützung etc. braucht hier so ziemlich jeder und beschreibt dein Problem nicht - Wenn sofort aus dem Titel ersichtlich ist worum es im Beitrag geht lesen viel mehr Leute die mit dem Thema bewandert sind deinen Beitrag. :-D

marabu 8. Mai 2007 17:33

Re: bräuchte mal unterstützung (Zahlensysteme)
 
Hallo Marco,

mit einem kleinen Trick kannst du das CASE-Statement vermeiden:

Delphi-Quellcode:
function HexToBin(const s: string): string;
const
  HexDigits = '0123456789ABCDEF';
  BinTetrade: array [0..15] of string[4]
    = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
       '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
  i, iNibble: Integer;
begin
  SetLength(Result, Length(s) shl 2);
  for i := 1 to Length(s) do
  begin
    iNibble := Pred(Pos(Upcase(s[i]), HexDigits));
    Move(BinTetrade[iNibble][1], Result[Succ(Pred(i) shl 2)], 4);
  end;
end;
Freundliche Grüße vom marabu

daddy 8. Mai 2007 17:44

Re: bräuchte mal unterstützung (Zahlensysteme)
 
Und hier noch ein kleiner Alternativvorschlag:

Delphi-Quellcode:
function HexToBinaer(C : Char) : String;
// Zu einem Hex-Zeichen (0..A) wird die passende 4-stellige Binäranzeige
// (inklusive abschließendem Leerzeichen) zurückgeliefert.
var c1, c2, c3, c4: Char;
    X : Byte;
begin
  if C <= '9' then X := ord(C) - 48 else X := ord(C) - 55;
  if X and 8 = 8 then c1 := '1' else c1 := '0';
  if X and 4 = 4 then c2 := '1' else c2 := '0';
  if X and 2 = 2 then c3 := '1' else c3 := '0';
  if X and 1 = 1 then c4 := '1' else c4 := '0';
  Result := c1 + c2 + c3 + c4 + ' ';
end;
Gruß

Daddy

Sharack 8. Mai 2007 17:50

Re: bräuchte mal unterstützung (Zahlensysteme)
 
wow, schöne funktion und sie läuft auch wunderbar, jeoch ist das schon etwas viel für mich und ich verstehe es nicht so ganz, kann also den code nicht ganz nachvollziehen, jedoch möchte ich das natürlich damit ich auch was lerne :-D, kannst du mir vielleicht die schleife mal ein wenig kommentieren? das wäre wirklich sehr nett.
Wenn ich das verstehe, bin ich bestimmt auch in der lage nach vier stellen ein ' ' //lehrzeichen einzufügen, damit es für die Übersicht noch schöner ist.

MFG

Marco

@ SirThornberry

Danke für das Willkommen heißen und natürlich ändere ich den Titel.



Edit:
@ daddy!

Hi, danke für deinen code, jeoch gibt es da probleme, da typen nicht gleich sind... müsste ich erst wieder umkonvertieren, jedoch ist das bereits "arbeit" für mich, da ich wirklich am anfang stehe :) aber danke für die Umstände!

Christian Seehase 8. Mai 2007 18:22

Re: bräuchte mal unterstützung (Zahlensysteme)
 
Moin Sharack,

ich bin jetzt zwar nicht marabu, aber ich versuche mal die Schleife zu kommentieren:

Delphi-Quellcode:
function HexToBin(const s: string): string;

const
  HexDigits = '0123456789ABCDEF';
  BinTetrade: array [0..15] of string[4]
    = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
       '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111');
var
  // iNibble, da ein halbe Byte (4-Bit) Nibble genannt wird
  i, iNibble: Integer;
begin
  SetLength(Result, Length(s) shl 2);
  for i := 1 to Length(s) do
  begin
    // Pos ermittelt ja die Position eines Zeichens in einem String
    // In diesem Falle wird es dazu benutzt die Position der hexadezimalen Ziffer
    // zu ermitteln.
    // Ist, z.b., im String ein C, so liefert Pos hier 12 zurück
    // Pred nimmt den Wert vor dem, den Pos zurückliefert (Predecessor = Vorgänger)
    // Man könnte hier auch
    // Pos(Upcase(s[i]), HexDigits)-1
    // schreiben.
    // Es muss 1 abgezogen werden, da iNibble den Index des Zeichens in BinTetrade
    // enthalten soll, da dieses Array bei 0 beginnt.
    iNibble := Pred(Pos(Upcase(s[i]), HexDigits));
    // Mit BinTetrade[iNibble][1] wird das erste Zeichen des über iNibble indizierten
    // Wertes adressiert. Die Angabe der [1] ist hier wichtig, da die Prozedur Move
    // für die ersten beiden Parameter keinen Typen vorsieht. Würde man [1] weglassen,
    // so würde man die Adresse von BinTetrade[iNibble] ansprechen, und nicht die
    // Stelle auf die die BinTetrade[iNibble] zeigt.
    // Bei Result[Succ(Pred(i) shl 2)] ist es ähnlich. Hier wird nur der Vorgänger von
    // i mal 4 genommen (einmal nach links schieben entspricht *2, zweimal *4, dreimal *8 usw.),
    // da ein String der BinTetrade die Länge von 4 hat. Zu diesem Ergebnis wird dann noch 1
    // addiert. (Succ => Successor).
    // Sinn des ganzen: Im Ergebnisstring werden, der Reihe nach die 1., 5., 9. ... Stelle angesprochen
    // und jeweils 4 Zeichen, eben der Wert des aktuell ermittelten Nibbles, kopiert.
    // Eine andere Schreibweise wäre: Result[((i-1)*4)+1]
    Move(BinTetrade[iNibble][1], Result[Succ(Pred(i) shl 2)], 4);
  end;
end;

Sharack 8. Mai 2007 18:31

Re: bräuchte mal unterstützung (Zahlensysteme)
 
Hey! vielen vielen dank! Ich werde mir das mal in Ruhe duchlesen und lernen :)

MFG

Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz