C Hexzahl trennen und zusammenfügen

KillerPinockel

Lieutenant
Registriert
Jan. 2009
Beiträge
664
Hallo,

ich habe einen kleiner Hänger.
Ich programmiere ein Array welches zwei HexZahlen enthält. Als Beispiel:
Code:
uint16_t HEX[2]
HEX[0] = 41
HEX[1] = 23

Nun möchte ich gern, dass ich daraus ein "123" bekomme. Ich habe es zwar mit Bit verschieben probiert, aber da hängt er mir gleich beide Ziffern vor an:

Code:
printf("%X \n", HEX[0] | HEX[1] << 8);

Das ergibt dann leider "4123".

Kann mir da jemand weiterhelfen?
Danke!
 
"quasi" eine Zeichenmanipulation meine ich damit.

Im Prinzip möchte ich die zweite Ziffer von HEX[0] an HEX[1] voranstellen
 
ich kenn mich zwar nicht mit der syntex von c aus da ich vb.net coder bin aber wäre nicht auch .splitt nicht auch eine möglichkeit ?
 
Ziffer: Also du willst ASCII Zeichen manipulieren?
Oder: Du willst eine "Hex​-Zahl" "umdrehen"? (Was auch immer das ist)

Also, folgendes brauchst du:
Mathe: Zahlen und deren Darstellung, Dezimalsystem, Hexadezimalsystem, ...
Bitmanipulation: Maskierung, Shifts

Eine Ziffer hat nur in​ einer Zahlendarstellung eine Bedeutung. Eine "zweite Ziffer" ist noch problematischer. Von wo an gezählt, was passiert bei größeren Zahlen...

Eine Hex-Ziffer bekommst du über das maskieren mit 0xF und dem richtigen Shift (zuerst die Maske hin << und dann das Ergebnis zurück >>).

Ich denke du willst (hex[0]&0xF)<<8|hex[1].
 
KillerPinockel schrieb:
Im Prinzip möchte ich die zweite Ziffer von HEX[0] an HEX[1] voranstellen
Dann musst du auch nur die zweite Ziffer nehmen. Momentan nimmst du ja beide Ziffern aus HEX[0].

Das geht mit Bitshift und AND Operator. zB: HEX[0] & 0xF liefert dir nur die erste Ziffer und ignoriert alles was davor steht.

Edit: Etwas zu langsam...

Gruß
BlackMark
 
Super! Das war es. Vielen vielen Dank für eure Hilfe!
Ergänzung ()

Nur damit ich meine Unterlagen vollständig habe...
Gleiches Beispiel wie oben nur das ich die erste Ziffer gern hätte. Also erste Ziffer aus dem Array. So richtig habe ich es noch nicht raus :(
BSPW: "423"
 
Überleg dir am besten mal wie deine Hex-Zahlen in binär aussehen:
41(hex) = 0100 0001(bin)
23(hex) = 0010 0011(bin)

Je 4 bit = eine "Hex-Ziffer"

Wenn du jetzt die 4 vorne an die 23 stellen willst, musst du zuerst die 1 der 41 los werden.
Also shiftest du die 41 einfach um 4 nach rechts, wodurch die 1 wegfällt:
0100 0001(bin) >> 4 = 0000 0100 = 4(hex)

Jetzt musst du noch die 4 an die richtige Stelle schieben:
0100(bin) << 8 = 0100 0000 0000(bin) = 400(hex)

Und dann pappst du das Ganze noch zusammen:
400(hex) + 23(hex) = 0100 0000 0000(bin) + 0010 0011(bin) = 0100 0010 0011(bin) = 423(hex)

Alternativ:
Du kannst die 4 auch maskieren und so alle anderen Ziffern verwerfen:
41(hex) & F0(hex) = 0100 0001(bin) & 1111 0000(bin) = 0100 0000(bin) = 40(hex)

Jetzt musst du die 4 wieder an die richtige Stelle bringen:
40(hex) = 0100 0000(bin) << 4 = 0100 0000 0000(bin) = 400(hex)

Und dann noch addieren (siehe oben).
 
Ich würde für das "Zusammenpappen" nicht die Addition verwenden, sondern bitwise-OR, also den | Operator. Es ist zwar total egal, sofern kein Übertrag auftritt verhalten sich Addition und OR exakt gleich, aber gängige Konvention ist für solche bit Manipulationen auch bit Operatoren zu verwenden und die Addition nur für arithmetische Operationen.

Gruß
BlackMark
 
Das ist mir klar, ich dachte nur es ist für ihn evtl. leichter verständlich wenn ich in meiner Erklärung den arithmetischen Operator benutze.

Wenn man das ganze in Code umsetzt, sollte man dann natürlich den binären OR-Operator nutzen. Hätte ich wohl dazu schreiben sollen.
Danke für die Ergänzung :)
 
Zurück
Oben