Char in 2 Hälften teilen

Gast #522251
Lesenswert?

Hi.
Ich mache gerade meine ersten gehversuche mit µCs und C.
Im Tutorial habe ich was gefunden wie man einzelne Bits von Ports und 
registern setzen, löschen oder abfragen kann.
Gibt es etwas vergleichbares auch mit 4 Bit?
Ich möchte das High- und das Low Nibble betrennt voneinander betrachten, 
aber nur ein Zeichen verwenden
Beispiel:
Das Zeichen ist 0x0d und ich möchte das High-Nibble um eins erhöhen.
Wie kann ich in einer If oder case abfrage rausfinden, ob das Low-Nibble 
z.B. 7 ist?
Gast #522262
Lesenswert?

Die Bit-Operatoren sind dein Freund
http://www.pronix.de/pronix-676.html

// Das Zeichen ist 0x0d...

unsigned char daten = 0x0d;
unsigned char oberes_nibble  = (daten & 0xF0) >> 4 ;
unsigned char unteres_nibble = (daten & 0x0F);

// ... und ich möchte das High-Nibble um eins erhöhen.

oberes_nibble += 1;
daten = (oberes_nibble << 4) | unteres_nibble;

// Wie kann ich in einer If oder case abfrage rausfinden,
// ob das Low-Nibble z.B. 7 ist?

if (unteres_nibble == 7)

// Ich möchte das High- und das Low Nibble betrennt voneinander 
betrachten,
// aber nur ein Zeichen verwenden

#define OBERES_NIBBLE(x)  (((x) & 0xF0) >> 4)
#define UNTERES_NIBBLE(x)  ((x) & 0x0F)

if (UNTERES_NIBBLE(daten) == 7)

daten = ((OBERES_NIBBLE(daten) + 1) << 4) | UNTERES_NIBBLE(daten);
Gast #522278
Lesenswert?

Wenns wirklich nur um Erhöhungen um feste Werte (z.B. 1) geht, würde ich 
das Hin- und Hergeshifte seinlassen. Kostet nur Zeit und Codezeilen, 
auch wenns etwas leichter zu verstehen ist.

also daten = ((daten & 0xf0) + 0x10) | (daten & 0x0f)

Für wüste Berechnungen damit sind Makros wie von Stefan vorgeschlagen 
natürlich übersichtlicher.

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