Forum: Compiler & IDEs Klammern bei Bitmanipulation


von Alex E. (chekov-e)


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

von Anonym (Gast)


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.

von Stefan B. (stefan) Benutzerseite


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

von Yalu X. (yalu) (Moderator)


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

von Alex E. (chekov-e)


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

von Klaus W. (mfgkw)


Lesenswert?

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

Das ist falsch (die Gesamtaussage aber trotzdem richtig).

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.