Fehler im C-Buch?

(Firma: Frickelhauptquartier) #5734050
Lesenswert?

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 #5734056
Lesenswert?

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))
#5734057
Lesenswert?

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 #5734063
Lesenswert?

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.
(Firma: Frickelhauptquartier) #5734079
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren