Forum: Compiler & IDEs Negierte if_Abfrage - Effekt eines Bit Vergleichs ?


von John S. (student)


Lesenswert?

Hallo zusammen

  if (!(PINB & (1<<PIN1))) ...

ist sicherlich eine richtige Abfrage.


Was aber passiert bitte bei dieser Abfrage ?

  if (~(PINB & (1<<PIN1))) ...


Danke im voraus und Grüße

von Karl H. (kbuchegg)


Lesenswert?

John Schmitz schrieb:


> Was aber passiert bitte bei dieser Abfrage ?
>
>   if (~(PINB & (1<<PIN1))) ...

! ist die logische Negierung

    aus 0           wird   1
    aus nicht 0     wird   0

Bei der bitweisen Negierung mit ~ wirst du in deinem Fall jedoch nie 0 
erhalten.

Denn entweder das Bit ist 0, dann kommt bei ~ 0xFF raus
Oder aber das Bit ist 1. Dann sind aber die anderen Bits deswegen 
trotzdem noch 0, und deren Negierung sorgt für 1 BIts im Ergebnis. Das 
Ergebnis hat dann zwar an der Stelle PIN1 eine 0, aber die restlichen 
Bits sind 1.

-> in keinem der beiden Fälle kommt 0 raus. Und damit ist das ein 
Vergleich der immer wahr sein wird.

Hinweis: Bei Bitfragen ist es oft hilfreich sich einfach die möglichen 
Fälle aufzuschreiben und die Operation(en) im Kopf zu machen. Bei dir 
ist nur 1 Bit beteiligt, daher gibt es nur 2 Fälle: Bit ist 0 bzw. Bit 
ist 1. Und dann siehst du dir einfach die Ergebnisse an und was sie in 
deinem konkreten Anwendungsfall bedeuten.

von John S. (student)


Lesenswert?

Okay - habe ich verstanden, so glaube ich.

Also ALLE Bits werden EINZELN negiert. Das klärt meine Frage an sich.

Grüße

von Oliver (Gast)


Lesenswert?

Das ist genauso eine richtige Abfrage, die macht nur was anderes.

a) Was versteht C unter "wahr" oder "falsch"?
b) Was liefert (PINB & (1<<PIN1)) für ein Ergebnis (Typ und Wert?)

c) siehe
http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/logical.html
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/bitwise.html#one

Oliver

von Karl H. (kbuchegg)


Lesenswert?

John Schmitz schrieb:

> Also ALLE Bits werden EINZELN negiert. Das klärt meine Frage an sich.

Alle Bitoperationen arbeiten auf den Bits eines Bytes einzeln.
Bitoperationen: & | ~ ^

Alle logischen Operationen liefern entweder 0 oder 1 und akzeptieren 0 
(für 'falsch') und nicht 0 (für 'wahr')
logische Operationen: && || !

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.