Veit D. schrieb:
> Das ist ja genau das was wir dem TO nicht empfehlen. Doppelt gemoppelt.
> Eine zusätzliche Fehlerquelle ohne Nutzen und zudem falsch. Du nennst
> das eine Maske und das andere Muster. Ist aber jeweils das Selbe. Eins
> davon muss weg. Und eigentlich sollte man keine defines mehr verwenden,
> sondern konstante Variablen.
Nichts doppelt gemoppelt - genau so sollte man es machen. Kürzen bitte
ausschließlich dem Compiler/Optimizer überlassen, sonst ist die Source
unvollständig.
Die Maske spannt sich über alle Bits auf, das Muster hat innerhalb der
Maske Nullen oder Einsen, außerhab don't-cares. Sind also nicht per se
gleich. Es gibt aber zu jeder Maske auch ein Muster, das der Maske
entspricht.
Dass die Maske aus nur einem Bit besteht, ist ein Sonderfall. Und auch
zu einer Maske mit nur einem Bit gibt es 2^n Muster, also zwei Muster -
eines mit Null, eines mit Eins.
Bei meinem Beispiel hatte sich ein Typo eingeschlichen, hinten fehlte
beim Muster eine 0. Das hätte man erkennen können. Hier noch mal
korrigiert:
1 | if (PIND & 0b00110000 == 0b0001000*0*)
|
Maske und Muster sind allgemein nicht gleich. Sie sind nur gleich, wenn
man ein einzelnes Bit auf Eins abfragt.
Zur Maske 0b00*11*0000 gäbe es die vier abzufragenden Muster
0b00*00*0000, 0b00*01*0000, 0b00*10*0000 und 0b00*11*0000.
Wie gesagt, ein angelegter Record (Schreibweise mit Doppelpunkt) räumt
mit diesen Konstrukten gänzlich auf. Man muss sich dann auch bei den
abgefragten Mustern nicht mehr ums Schieben kümmern.