Forum: PC-Programmierung dezimalzahl in drei hexazahlen umwandeln


von Johannes (Gast)


Lesenswert?

Hallo, ich habe ein für mich riesiges Problem, da ich nicht weiterkomme 
und hoffe hier einen wink in die richtige Richtung zu bekommen.

das ganze mache ich in c++

ich bekomme einen Integer-Wert(z.B.60)
das Ziel ist es, drei Hex-werte daraus zu ermitteln, die sich wie folgt 
zusammenstellen.

Zunächst wandle ich die Zahl in binär um
1
Switches = 60;
2
SwitchWert = 0;
3
Faktor = 1;
4
while(Switches){
5
  rest = Switches % 2;
6
  Switches = Switches / 2;
7
  faktor *= 10;
8
  SwitchWert = SwitchWert + rest * faktor;
9
}
Bei 60 käme heraus 111100;

Damit ich auf 6 Stellen komme (da ja kleinere Zahlen(z.B.3) nur 011 
erbeben würden mache ich anscließend
1
Ergebnis = 000000^SwitchWert;

Jetzt benötige ich die zahlen wie folgt
immer zwei Ziffern zusammen.
Also die ersten zwei: 11 -> 0x03
die zweiten zwei: 11 -> 0x03
und die dritten zwei: 00 -> 0x00

also mein Ziel ist es, die Werte 0x03, 0x03 und 0x00 zu bekommmen, habe 
aber absolut keine Ahnung mehr, wie ich weiter vorgehen muss.

von Dummschwaetzer (Gast)


Lesenswert?

>ich bekomme einen Integer-Wert(z.B.60)
0 .. 65535, 2Byte

>Ergebnis = 000000^SwitchWert;
???

>Also die ersten zwei: 11 -> 0x03
>die zweiten zwei: 11 -> 0x03
>und die dritten zwei: 00 -> 0x00
anders:
zyxwvu
u:bit0
v:bit1
w:bit2
x:bit3
y:bit4
z:bit5

(zyxwvu&000011b) ist dein ergebniss für die dritten zwei
shiften
zyxwvu>>2
egibt
zyxw
(zyxwvu&0011b) ist dein ergebniss für die zweiten zwei
shiften
zyxw>>2
egibt
zy ist dein ergebniss für die ersten zwei

von Bitflüsterer (Gast)


Lesenswert?

Alle Daten in einem Computer werden intern als Folgen von binären 1 und 
0 dargestellt.

Also ist schon die Dezimalzahl 60 intern als binär 00111100 vorhanden.
Die 60 ist eben die Interpretation diese binären Folge als Dezimalzahl.

Was Du willst, ist eine Interpretation dieser Folge von binären Ziffern, 
bei der drei Gruppen von jeweils zwei Binärziffern zusammengefasst 
werden.

Diese Gruppierung erreicht man in einem ersten Schritt durch 
"Maskierung".
Die Masken dazu sind in Binärziffern:

Binär     Hexadezimal
00110000  0300
00001100  0030
00000011  0003

Die Operation in C ist die Und-Verknüpfung:
1
ErsteZahl  = Switches & 0x0300
2
ZweiteZahl = Switches & 0x0030
3
DritteZahl = Switches & 0x0003

Nun unterscheiden sich die Ergebnisse (bis auf "DritteZahl") nach diesem 
Schritt noch in einem wesentlichen Punkt von Deinem gewünschten 
Ergebnis.
Sie sind um 8 Bit resp. 4 Bit nach links verschoben. Interpretiert man 
diese Ergebnisse als Zahlen so sind das die Faktoren 256(dez) resp. 
0xFF(hex) und 16(dez) 0x0F(hex).
Um diesen Faktor zu entfernen kann man Schiebeoperationen mit Vorteil 
verwenden und so die Verschiebung nach Links durch eine Verschiebung 
nach rechts (sozusagen) "aufheben".
1
ErsteZahl  = (Switches & 0x0300) >> 8
2
ZweiteZahl = (Switches & 0x0030) >> 4
3
DritteZahl = Switches & 0x0003

Nur bei der dritten Zahl ist das nicht nötig, da sich die zu beachtenden 
Stellen der Binärzahl schon an der richtigen Stelle befinden; d.h. 
keinen Faktor beinhalten.

Ich möchte Dir an dieser Stelle empfehlen, Dich noch einmal gründlich 
mit den Bitoperationen zu beschäftigen. Das ist grundlegendes 
Handwerkszeug in der uC-Programmierung.

Viel Erfolg noch.

von Karl H. (kbuchegg)


Lesenswert?

Johannes schrieb:

> Zunächst wandle ich die Zahl in binär um

Wozu?
Ist doch nur ein unnötiger Zwischenschritt.
Ob du laufend durch 2 dividierst, oder das gleiche Schema mit 256 
anwendest, ist doch völlig egal. Nur das du in letzterem Fall dann eben 
genau deine Aufteilung in 3 Bytes bekommst, die du dann natürlich zb als 
Hexadezimalzal ausgeben kannst bzw. was du eben sonst so damit machen 
willst.

PS: lass dich nicht davon irre machen, dass du mit Dezimal, Binär und 
Hex-zahlen jonglieren musst. Im COmputer ist alles dasselbe: ein 
Bitmuster, welches man sich als Hex-Zahl anzeigen lassen kann, als 
Binärzahl anzeigen lassen kann, als Dezimalzahl anzeigen lassen kann. 
Prinzipiell ist es immer die gleiche Zahl und auch immer das gleiche 
Bitmuster. Binär, Dezimal bzw. Hex sind einfach nur 3 unterschiedliche 
Methoden wie man sich dieses Bitmuster ausgeben lassen kann.

D.h. was du in Wirklichkeit machen willst: Du willst deine Zahl in 3 
Bytes zerlegen. Ob du dir dann diese 3 bytes als Dezimalzahl, als 
Binärzahl oder als Hexzahl anzeigen lässt (oder überhaupt ganz anders) 
ist eine ganz andere Geschichte. Grundsätzlich zerlegst du erst mal 
deinen int(?) in 3 Bytes.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Bitflüsterer schrieb:
> Binär     Hexadezimal
> 00110000  0300
> 00001100  0030
> 00000011  0003

Das stimmt nicht

Binär     Hexadezimal
00110000  30
00001100  0C
00000011  03

Somit sind dann auch die Shiftstellen andere
1
ErsteZahl  = (Switches & 0x0030) >> 4
2
ZweiteZahl = (Switches & 0x00C) >> 2
3
DritteZahl = Switches & 0x0003

von Johannes (Gast)


Lesenswert?

Oha oha oha,
danke für die Informationen. Da kann ich erst mal weiter arbeiten.
Dankeschön

von Bitflüsterer (Gast)


Lesenswert?

Meine Güte, da war ich doch tatsächlich mal schneller als Karl Heinz.
Wo ist der Kalender? :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bitflüsterer schrieb:
> Meine Güte, da war ich doch tatsächlich mal schneller als Karl Heinz.

Dafür aber falsch ;-)

von Bitflüsterer (Gast)


Lesenswert?

Johann L. schrieb:
> Bitflüsterer schrieb:
>> Meine Güte, da war ich doch tatsächlich mal schneller als Karl Heinz.
>
> Dafür aber falsch ;-)

Auweia. Danke Johann. Die Bitmasken und die Verschiebung versiebt. Na 
sowas!

Es muss natürlich sein:

Die Masken dazu sind in Binärziffern:

Binär     Hexadezimal
00110000  30
00001100  C0
00000011  03

Die Operation in C ist die Und-Verknüpfung:
1
ErsteZahl  = Switches & 0x030
2
ZweiteZahl = Switches & 0x0C0
3
DritteZahl = Switches & 0x003

und
{c]
ErsteZahl  = (Switches & 0x030) >> 4
ZweiteZahl = (Switches & 0x0C0) >> 2
DritteZahl = Switches & 0x003
[/c]

Sorry.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.