Forum: Mikrocontroller und Digitale Elektronik Registerinhalte vergleichen


von Bitlover (Gast)


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

von Karl H. (kbuchegg)


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

von Frickler (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> (0x30 || 0x01 || 0x00)   ergibt 0x30

Falsch. True.

von bitte löschen (Gast)


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

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.