Fehler im C-Buch?

OP (Firma: Frickelhauptquartier) #5734050
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?
Gast
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.
Gast
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.
Gast
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.
OP (Firma: Frickelhauptquartier)
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.