Hex- & Dual-Zahlen umwandeln

TS-JC

Erfahrenes Mitglied
ich will normale Zahlen in Hex, oder auch Dual-Zahlen umwandeln
ich habe bloss keine Ahnung wie ich das machen soll
irgentwie mit einer Schleife, die immer 2 hoch 0+1 rechnet
aber ich weiss nciht genau wie ich das machen soll

hat da einer ne Idee?
 

TS-JC

Erfahrenes Mitglied
habe mir das jetzt mal angeguckt, war aber nicht das, was ich gesucht habe
bei dem beispiel ging es um eine bestimmte anzahl an stellen und auch nur in checkbox-form

ich meine aber:
ein edit-teil, dahinein schreibt man z.b. eine normale zahl
diese wird dann in nullen und einsen umgewandelt
also immer durch 2 geteilt und dann bei zahl ohne komma-wert wird eine 1 gesetzt udn bie komma-wert eine null
danach das ganze von vorne, aber nur die zahl ohne den komma-wert

hat das wer verstanden?

wenn ja, hat wer ne idee?

ich bräuchte das ganze auch noch rückwärst
 

Friesi

Erfahrenes Mitglied
hatte das auch vor zu machen :)
wollte gerade hier fragen wie ich das ambesten machen könnt und dann hab ich diese Thread gesehen :)

Hast du schon eine lösung?!
Ich könnte es mir irgendwie mit einer Zeichenkette vorstellen?! aber wie setze ich das ambesten um?!
Wie man die Zahl so ausrechnet weis ich ja :D nur weis nicht wie ich es ambesten als Programm umsetzte!
also wenn du eine lösung hast oder mit tipps geben könntest (oder ein anderer) wäre das nett!
 

Dario Linsky

Erfahrenes Mitglied
der code zur umrechnung vom dezimal- ins binärsystem sieht ungefähr so aus:
Code:
var
  i: Integer;
  b: String;
begin
  i := 20;
  while i > 0 do
  begin
    if (i mod 2) <> 0 then b := b + '1'
    else b := b + '0';
    i := i div 2;
  end;
end;
zumindest ist das eine möglichkeit. eine andere variante wäre bitweises verschieben mit shl und shr.

der code zum zurückrechnen könnte dann so aussehen:
Code:
var
  i: Extended;
  b: String;
  c: Integer;
begin
  b := '10100';
  i := 0;
  for c := 1 to Length(b) do
  begin
    i := i + (StrToFloat(b[ c]) * Power(2, Length(b) - c));
  end;
  ShowMessage(FloatToStr(i));
end;

was du allerdings mit dem komma meintest, versteh ich nicht so ganz...
 

Friesi

Erfahrenes Mitglied
mhm so ganz genau will das nicht :)
beim ersten kommt irgendwie immer 0 raus *gg*
könntest du vielleicht auch eben auf textbasis schreiben was du da gemacht hast?! denn mit dem MOD kann ich zurzeit nichts anfangen :/

wäre nett! bin noch nicht so ein Delphiprofi :)
 

Dario Linsky

Erfahrenes Mitglied
okay, also noch eine beschreibung dazu. das umrechnen von dezimalzahlen ins binärsystem funktioniert folgendermassen:
du hast z.b. die ausgangszahl 20 (i := 20). damit fängst du an, und solange du nicht den wert 0 rausbekommst, teilst du die zahl durch 2 und machst mit dem ergebnis weiter:

Code:
20:2 = 10 (kein rest -> 0)
10:2 = 5 (kein rest -> 0)
5:2 = 2,5 (rest -> 1)
2:2 = 1 (kein rest -> 0)
1:2 = 0 (rest -> 1)

wenn beim ergebnis der division ein rest übrigbleibt, kommt an die stelle eine 1, ansonsten eine 0. nachkommastellen werden ignoriert, weil wir nur mit ganzen zahlen arbeiten.
dann kommt da also 0, 0, 1, 0, 1 raus - das musst du dann noch umdrehen, und schon kommt da 10100 raus.
mit mod (modulodivision) prüfst du nur, ob bei einer division durch 2 ein rest bleibt, oder nicht.

das zurückrechnen sieht folgendermassen aus:
10100 -> (1 * 2^4) + (0 * 2^3) + (1 * 2^2) + (0 * 2^1) + (0 * 2^0) -> (1 * 16) + (0 * 8) + (1 * 4) + (0 * 2) + (0 * 1) -> 16 + 4 = 20.

und damit das ganze dynamisch wird, läuft das alles über eine schleife. mit bitweisem schieben lässt sich das auch lösen, denn wenn man einen binärwert um eine stelle nach rechts verschiebt (shr = shift right), halbiert sich der wert:
1000 = 8
0100 = 4
0010 = 2
0001 = 1
bei verschiebungen nach links (shl = shift left) verdoppelt sich der wert natürlich dementsprechend. wenn du noch fragen dazu hast - immer her damit. ;)
 

Friesi

Erfahrenes Mitglied
ahhh *licht aufgeht*
so verstehe ich nun auch die Verarbeitung!
Bekomme nun auch ein ergebnis .. hatte die verarbeitung nur flasch verstanden und hab "i" als ausgabe wert genommen! aber es ist ja "b" :D
Man kann doch bestimmt nun den wert in delphi umdrehen oder ?! :)
könntest du mir vielleicht noch verraten wie das geht *gg*
 

Dario Linsky

Erfahrenes Mitglied
strings umdrehen könntest du z.b. mit einem bubblesort-algorithmus, denn strings sind ja nichts anderes als arrays aus einzelnen zeichen. beispielcode zum bubblesort findest du bei google oder hier mit der suchfunktion.
aber eigentlich brauchst du den string gar nicht umdrehen, weil du ja in der schleife jedes bit einzeln an den string anhängst. das kannst du dann ja einfach noch so abändern, dass du nicht das bit an den string anhängst (b + '1'), sondern den string an das bit ('1' + b) . ;)