AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

bräuchte mal unterstützung (Zahlensysteme)

Ein Thema von Sharack · begonnen am 8. Mai 2007 · letzter Beitrag vom 8. Mai 2007
Antwort Antwort
Sharack

Registriert seit: 8. Mai 2007
3 Beiträge
 
#1

bräuchte mal unterstützung (Zahlensysteme)

  Alt 8. Mai 2007, 16:53
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 8. Mai 2007, 17:30
Hallo Sharack, willkommen in der 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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

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

  Alt 8. Mai 2007, 17:33
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
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
124 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 8. Mai 2007, 17:44
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 <= '9then X := ord(C) - 48 else X := ord(C) - 55;
  if X and 8 = 8 then c1 := '1else c1 := '0';
  if X and 4 = 4 then c2 := '1else c2 := '0';
  if X and 2 = 2 then c3 := '1else c3 := '0';
  if X and 1 = 1 then c4 := '1else c4 := '0';
  Result := c1 + c2 + c3 + c4 + ' ';
end;
Gruß

Daddy
  Mit Zitat antworten Zitat
Sharack

Registriert seit: 8. Mai 2007
3 Beiträge
 
#5

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

  Alt 8. Mai 2007, 17:50
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 , 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!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 8. Mai 2007, 18:22
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Sharack

Registriert seit: 8. Mai 2007
3 Beiträge
 
#7

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

  Alt 8. Mai 2007, 18:31
Hey! vielen vielen dank! Ich werde mir das mal in Ruhe duchlesen und lernen

MFG

Marco
  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 14:11 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