Fehler im C-Buch?

OP (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 #5734055
Lesenswert?

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 #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.
#5734065
Lesenswert?

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

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

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