Klammern bei Bitmanipulation

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren