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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.