Forum: Compiler & IDEs Char in 2 Hälften teilen


von gast (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

gast wrote:

> Das Zeichen ist 0x0d und ich möchte das High-Nibble um eins erhöhen.
1
  uint8_t c = 0x0d;
2
3
  c = ((c & 0xf0) + 1) | (c & 0x0f);

> Wie kann ich in einer If oder case abfrage rausfinden, ob das Low-Nibble
> z.B. 7 ist?
1
  if ((c & 0x0f) == 7) {
2
     /* ... */
3
  }

von Stefan (Gast)


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);

von der mechatroniker (Gast)


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.

von gast (Gast)


Lesenswert?

Vielen Dank.
Ich probiers mal aus.

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.