Ich hab hier das Buch "AVR-Mikrocontroller Programmierung in C" Auf Seite 89 sind Beispiele zur Bitmaskierung; ich komme bei dem Beispiel // prüfe ob Bit 2 oder 6 in der Variable data gesetzt ist if (data & 0x44) // prüfe ob Bit 2 oder 7 in der Variable data gelöscht ist if (~data & 0x84) ins schleudern. Steht das "&" nicht für und? Irgendwie verstehe ich diese beiden Beispiele nicht. Kann mich mal einer aufklären?
Thomas G. schrieb: > Steht das "&" nicht für und? Ja, für das binäre Und. Nicht zu verwechseln mit dem logischen und &&
Hallo vielleicht kannst du dich Fragen, Welche Wertigkeit die Bits 2 und 6 haben? Zum Beispiel hat bit 0 die Wertigkeit 1, bit 1 hat die Wertigkeit 2 und so weiter. Das stimmt also etwas nicht mit den bit Masken 0x44 undsoweiter.
Thomas G. schrieb: > // prüfe ob Bit 2 oder 6 in der Variable data gesetzt ist > if (data & 0x44) das kann man äquivalent umwandeln: if ((data & (0x40 | 0x04)) != 0) bzw. if ((data & 0x40) | (data & 0x04)) != 0) und jetzt wird das Oder sichtbar if ((data & (1<<6)) | (data & (1<<2))) != 0) macht noch klarer dass einzelne Bits geprüft werden. > > // prüfe ob Bit 2 oder 7 in der Variable data gelöscht ist > if (~data & 0x84) geht genauso zu verdeutlichen was genau passiert if ((~data & (1<<7) | (~data & (1<<2))
Thomas G. schrieb: > if (data & 0x44) Nimm data als einzelne 8 Bit und verUNDe sie mit 0x44:
1 | dddd dddd |
2 | & 0100 0100 |
3 | --------- |
4 | 0d00 0d00 |
Das Ergebnis ist also genau dann null, wenn die Bits 2 und 6 in "data" nicht gesetzt sind. Der Code:
1 | if (irgendwas) { bla } |
führt "bla" genau dann aus, wenn "irgendwas" nicht null ist.
Zusammengenommen:
"if (data & 0x44) { tuwas(); }"
führt tuwas() genau dann NICHT aus, wenn Bits 2 und 6 in data NICHT
gesetzt sind. Oder andersrum: tuwas() wird genau dann ausgeführt, wenn
mindestens eins der beiden Bits gesetzt ist.
Mal dir das mal auf Kästchenpapier auf, dann wird das klarer.
Das habe ich halbwegs verstanden, ich frage mich, wo das "oder" in den Beispielen herkommt.
Dirk B. schrieb: > Ja, für das binäre Und. Nicht zu verwechseln mit dem logischen und && Es ist schlichtweg das UND in beiden Fällen. Die mentalen Probleme kommen nur dadurch, daß C keine boolean Typen kennt, sondern selbige durch ein Agreement ersetzt hat. Deswegen auch das && Das ist das gleiche Problem wie bei der Fehlverwendung von = als Zuweisung, die dann das == notwendig macht. Wieso die Erfinder von C zu doof waren, um den Unterschied zwischen Äquivalenz und Zuweisung nicht zu kennen, bleibt ein Rätsel. C eben. W.S.
Das kommt daher, dass du eine Maske mit ZWEI gesetzten Bits hast und das Ergebnis der Operation mit null vergleichst. Jedes der beiden Bits reicht aus, um das Ergebnis "nicht null" zu machen. Das heißt, deine Bedingung wird dann wahr, wenn das erste ODER das zweite Bit dein & überlebt haben.
Thomas G. schrieb: > ich frage mich, wo das "oder" in den > Beispielen herkommt Da ist sogar ein "oder" zu wenig. Thomas G. schrieb: > // prüfe ob Bit 2 oder 6 in der Variable data gesetzt ist > if (data & 0x44) Oder beide.
S. R. schrieb: > Das kommt daher, dass du eine Maske mit ZWEI gesetzten Bits hast und das > Ergebnis der Operation mit null vergleichst. > ----- Jedes der beiden Bits reicht aus, um das Ergebnis "nicht null" zu machen. ---- > > Das heißt, deine Bedingung wird dann wahr, wenn das erste ODER das > zweite Bit dein & überlebt haben. "= 0" muss man sich auch noch dabei denken. Für Anfänger etwas undurchsichtig geschrieben. ----- Das ist das hüpfende Komma, danke
Nop schrieb: > Nö. 2 & 4 ist 0, 2 && 4 ist 1. kannst du eigentlich lesen? 2 & 4 ist null, das stimmt. Aber 2 && 4 ist Agreement, eben so wie ich das geschrieben habe. Woanders würde 2 && 4 schlichtweg einen Syntaxfehler ergeben, denn woanders gibt es tatsächlich den boolean Typ und der kennt nur 0 und 1, jedoch weder 2 noch 4. W.S.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.