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