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
~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.
> 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
~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 :)
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.