www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Registerinhalte vergleichen


Autor: Bitlover (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
if((Statusbyte << 1)== (0x30 || 0x01 || 0x00)) 
{
get_Weltherrschaft();
}


THX
Bitlover

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frickler (Gast)
Datum:

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

Falsch. True.

Autor: bitte löschen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.