mikrocontroller.net

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


Autor: John Schmitz (student)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John Schmitz (student)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay - habe ich verstanden, so glaube ich.

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

Grüße

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/l...
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/...

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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: && || !

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.