2x8Bit -> 2x4Bit ->1x8Bit

OP #357518
Lesenswert?

Hallo,
ich möchte zwei Bytes in zwei 4Bitwerte umwandeln und dann in einem
Byte speichern. Hat jemand einen Vorschlag wie ich das am einfachsten
in C bewerkstelligen kann.

Um die 8Bit in 4Bit zu verwandeln kann ich sie ja einfach durch 2
teilen. Nur wie bekomme ich die beiden dann wieder zusammen in ein
Byte?

Jetzt schonmal Danke für eure Hilfe!
Gast #357519
Lesenswert?

Hallo,

wenn du 255 (0b1111 1111) durch 2 teilst (div) erhälst du doch 128
(0b0111 1111), was mehr als 4bit Daten enthält. Das Zusammenfügen geht
mit & und | mit entsprechenden Shifts (>> und <<).

Marcus
Gast #357520
Lesenswert?

@Marcus:
Ein Teilen von 255 durch 2 ist das Gleiche wie ein einzelnes
Rechtsshift. Dabei kommt 127 heraus...

@Sascha:
Wie sollen die Zahlen denn aussehen?
Um das obere Nibble (höherwertige 4 Bits) zu erhalten, shiftet man
viermal nach rechts (x>>4). Fertig.
Um das untere Nibble zu erhalten verundet man mit 0x0F. (x & 0x0F)
Fertig.

Was möchstest du denn genau machen?
OP #357522
Lesenswert?

Also nochmal etwas genauer,
ich möchte 2 8Bit Werte aus dem ADC lesen und diese dann per Infrarot
übertragen, ich brauche aber keine 8Bit Auflösung bei den Werten.
Um die Packete für die IR-Übertragung möglichst klein zu halten möchte
ich deshalb die 2 Werte beim senden in einen zusammenfassen und beim
Empfänger die Werte wieder auseinanderdröseln.
Gast #357524
Lesenswert?

Ich verstehe das jetzt mal so, dass Du von zwei Messungen je einen
ADC-Wert in 8 Bit hast, wobei Dir 4 Bit Auflösung für die Übertragung
genügen. D.h. Du willst die High-Nibbles der zwei Bytes in einem
einzigen Byte speichern und verschicken, um sie am anderen Ende wieder
in zwei einzelne Bytes zu zerlegen.

Also auf Senderseite z.B.:

unsigned char ADWert1, ADWert2, SendeByte;
//...irgendwas...
SendeByte = (ADWert1 & 0xF0) | (ADWert2 >> 4);

Auf Empfängerseite:

unsigned char ADWert1, ADWert2, EmpfangByte;
//...irgendwas...
ADWert1 = EmpfangByte & 0xF0;
ADWert2 = EmpfangByte << 4;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren