Klammern bei Bitmanipulation

OP #2029775
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
Gast
~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.
Persönliche Seite
> 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
Moderator
~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 :)
OP
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 :)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.