Forum: Mikrocontroller und Digitale Elektronik Fehler im C-Buch?


von Thomas G. (Firma: Frickelhauptquartier) (taximan)


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?

von Dirk B. (dirkb2)


Lesenswert?

Thomas G. schrieb:
> Steht das "&" nicht für und?

Ja, für das binäre Und. Nicht zu verwechseln mit dem logischen und &&

von Karl M. (Gast)


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.

von guest (Gast)


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))

von S. R. (svenska)


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.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Das habe ich halbwegs verstanden, ich frage mich, wo das "oder" in den 
Beispielen herkommt.

von W.S. (Gast)


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.

von S. R. (svenska)


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.

von zitter_ned_aso (Gast)


Lesenswert?

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.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


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

von S. R. (svenska)


Lesenswert?

Gern geschehen. :-)

von Nop (Gast)


Lesenswert?

W.S. schrieb:

> Es ist schlichtweg das UND in beiden Fällen.

Nö. 2 & 4 ist 0, 2 && 4 ist 1.

von W.S. (Gast)


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.

von S. R. (svenska)


Lesenswert?

W.S. schrieb:
> Woanders
handelt es sich nicht um C. Falsches Thema.

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
Noch kein Account? Hier anmelden.