Registerinhalte vergleichen

Gast #1852202
Lesenswert?
• ▲
▼
Nabend, (oder guten Morgen?)

ich will mehrere mögliche Zustände mit einer if-Abfrage erschlagen.

Mein Statusbyte sieht bei einem TRUE wie folgt aus
a)0011 0000
b)0001 0000
c)0000 0000

Da vor dem Vergleich noch ein Bit drinsteht, das mich nicht 
interressiert und das einen unvorhersehbaren Zustand hat, möchte ich es 
gern rausschieben.
Für den Fall a) wäre das Statusbyte
vorher 1001 1000
nacher 0011 0000

Kann ich die if-Abfrage mit folgender Zeile machen, oder ist das falsch?
1
if((Statusbyte << 1)== (0x30 || 0x01 || 0x00)) 
2
{
3
get_Weltherrschaft();
4
}


THX
Bitlover
#1852213
Lesenswert?
• ▲
▼
Bitlover schrieb:
> Nabend, (oder guten Morgen?)
>
> ich will mehrere mögliche Zustände mit einer if-Abfrage erschlagen.
>
> Mein Statusbyte sieht bei einem TRUE wie folgt aus
> a)0011 0000
> b)0001 0000
> c)0000 0000
>
> Da vor dem Vergleich noch ein Bit drinsteht, das mich nicht
> interressiert und das einen unvorhersehbaren Zustand hat, möchte ich es
> gern rausschieben.

Maskier es einfach aus

  uint8_t tmp;
  tmp = Statusbyte & 0x7F;

  if( Statusbyte == 0x18 ||
      Statusbyte == 0x08 ||
      Statusbyte == 0x00 )


> Kann ich die if-Abfrage mit folgender Zeile machen, oder ist das
> falsch?

Das was du hast, ist schon gültiges C, nud macht es etwas anderes

(0x30 || 0x01 || 0x00)   ergibt 0x30

so dass dein Vergleich de facto

  if((Statusbyte << 1)== 0x30)
  {
    get_Weltherrschaft();
  }
lautet
Gast #1852277
Lesenswert?
• ▲
▼
Moinmoin!
C unterscheidet zwischen Bit-Operatoren und logischen Operatoren.

Die Bit-Operatoren sind z.B. "&" für AND, "|" für OR, "^" für XOR 
(jeweils zwischen den beiden Operanden) und "~" für NOT (vor dem 
einzelnen Operanden).
Bit-Operationen werden komplett ausgewertet. Das heißt, im Codeschnipsel 
"int b; b = funktion1() | funktion2();" wird funktion2 auch dann 
aufgerufen, wenn funktion1 bereits einen Wert ungleich 0 zurückgegeben 
hat.

logische Operationen werten nicht einzelne Bits aus, sondern nur, ob ein 
Wert 0 (false) oder ungleich 0 (true) ist. Sie sind z.B. "&&" für AND, 
"||" für OR und "!" für "NOT".
Logische Operationen werden hintereinander ausgewertet, bis ein Ergebnis 
feststeht. Das heißt, im Codeschnipsel "int b; b = funktion1() || 
funktion2();" wird funktion2 nur dann aufgerufen, wenn funktion1 den 
Wert 0 zurückgegeben hat.
Nebenbemerkung dazu: Es ist eine Frage der Laune des Programmierers, der 
den Compiler gebaut hat, was bei logischen Operationen als true-Wert 
herauskommt, da jeder Wert ungleich 0 ein gültiger true-Wert ist. Eine 
Abfrage wie "if ((a == b) == 1) ..." mag also in Einzelfällen 
funktionieren, ist aber in jedem Fall quatsch.

Daraus folgt, dass ein Wert, der mit einem logischen Operator behandelt 
wird, nicht im Ergebnis des Terms auftauchen kann. In folgendem Code hat 
der Wert von c keinen Bezug zu den Ausgangswerten a und b, sondern 
erhält nur einen boolschen Wert, der sich aus der boolschen 
Interpretation der Werte a (true) und b (false) ergibt.

int a,b,c;
a = 5;
b = 0;
c = (a || b);

Also (0x30 || 0x01 || 0x00) ergibt schlicht true, was immer das in 
diesem speziellen Compiler gerade ist, und wird schon zur Zeit des 
Kompilierens weg optimiert.

Was Du willst, ist:

ByteDatentypDeinesStandardheaders x;
x = Statusbyte & 0x7F; // 8. Bit ausmaskieren
if (x == 0x30 || x == 0x10 || x == 0)
{
  malganzbescheidensein();
}

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.