mikrocontroller.net

Forum: Compiler & IDEs Klammern bei Bitmanipulation


Autor: Alex E. (chekov-e)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was ist der Unterschied zwischen

PORTD &= ~1<<PD4;
und
PORTD &= ~(1<<PD4);
?

Habe bisher ohne Klammern programmiert und habe jetzt das komische 
Gefühl, dass es falsch ist.
Nach wiederholtem lesen des Artikels Bitmanipulation, meine ich, dass
~1<<PD4 soviel heißt wie 0<<PD4 und damit PORTD komplett auf 0 gesetzt 
wird.

Die Praxis sagt aber was anderes, ich verstehs nicht...

Gruß
Alex

Autor: Anonym (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
~1<<PD4 heißt soviel wie 0<<PD4 wenn du nun den Artikel über 
Bitmanipulation zur Hilfe nimmst, dann siehst du das << nichts anderes 
als ~1*2^PD4 ist ~1=0 und 0*x ergibt immer 0.
Daher schiebst du garnicht.
Ein ~(1<<PD4) ergibt aber ein 0x00001000 welches invertiert nun zu dem 
Ergebniss 0x11110111 führt. Also ist die Klammersetzung zu beachten.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe bisher ohne Klammern programmiert und habe jetzt das komische
> Gefühl, dass es falsch ist.

Du willst dich über die Vorrangregeln von C Operatoren informieren.
z.B. hier: http://www.ostc.de/c-precedence.pdf

~ hat eine höhere Priorität als <<, deshalb müssen die Klammern her.

~1<<4:
1   => 0b00000001
~1  => 0b11111110
<<4 => 0b11100000

~(1<<4):
1   => 0b00000001
<<4 => 0b00010000
~() => 0b11101111

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
~1<<PD4 = 0b1111111111111110<<4 = 0b1111111111100000
~(1<<PD4) = ~(0b0000000000000001<<4) = 0b1111111111101111

Ohne Klammern werden also die Bits 0 bis 4 von PORTD auf 0 gesetzt, mit
Klammern nur Bit 4. Wahrscheinlich willst du letzteres, also musst du
die Klammern setzen.

Edit: zu spät :)

Autor: Alex E. (chekov-e)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch für die Antworten,
jetzt ist alles klar und es passt auch zu dem, was ich an den Ports 
beobachte.
Bin trotzdem schockiert, dass ich die ganze Zeit über "falsch 
programmiert" habe und es trotzdem irgendwie lief :)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anonym schrieb:
> ~1<<PD4 heißt soviel wie 0<<PD4

Das ist falsch (die Gesamtaussage aber trotzdem richtig).

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.