PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Newbee Fragen



Lightstorm
09.03.2010, 09:35
Hallo Zusammen,

bin bei meinen ersten Gehversuchen in C. Es soll dabei ein Schalter realisiert werden, der die LED an/aus schaltet (quasi der Klassiker).

Meine Frage, sind die unten stehenden Codepärchen jeweils gleichbedeutend (mit gleicher Wirkung) oder werden unterschiedliche Werte ausgegeben? Mein Verständnis der Binärwerte steht jeweils darunter:

PORTC &= ~(1<<5)
PORTC &= (0<<5)
xxxxxxxx
and 11011111
= xx0xxxxx


PORTC & 1<<5
PORTC & (1<<5)
xx1xxxxx
= wahr/falsch


!(PIND & 1<<2)
PIND & (0<<2)
nicht xxxxx1xx oder xxxxx0xx
= wahr/falsch

p_mork
09.03.2010, 10:36
Hallo Lightstorm!



PORTC &= ~(1<<5)
PORTC &= (0<<5)


(0<<5) ist 0, weil eine 0 um 5 Bit nach links verschoben immer noch eine 0 bleibt. ~(1<<5) ist hingegen 11011111, weil dort eine 1 um 5 Stellen nach links verschoben wird (00100000) und dann duch das ~ invertiert wird. Deshalb sind die beiden Zeilen nicht gleichbedeutend, im zweiten Ausdruck PORTC mit 0 verUNDet, also auf 0 gesetzt wird.



PORTC & 1<<5
PORTC & (1<<5)


Diese beiden Zeilen sind gleichbedeutend, da der << Operator eine höhere Priorität hat als das & . Allerdings würd ich die Klammern trotzdem da lassen, weil es den Lesefluss erleichtert und man nicht voraussetzen darf, dass jeder die Prioritäten kennt (ich musste auch erstmal nachgucken :))



!(PIND & 1<<2)
PIND & (0<<2)


Analog zum ersten Paar gilt auch hier, dass (0<<2) = 0, weshalb der zweite ausdruck immer false ist.

MfG Mark

Lightstorm
09.03.2010, 12:03
Herzlichen Dank - das hat mir in meinem Verständnis weiter geholfen. Die Idee mit dem Verschieben hab ich noch nicht ganz durchgestiegen, deine Erklärung bringt mich dem aber etwas näher.

Danke

sternst
09.03.2010, 12:26
Die Idee mit dem Verschieben hab ich noch nicht ganz durchgestiegena<<b:
a ist der Ausgangswert und b die Anzahl der Stellen, um die der ganze Wert nach links geschoben wird, wobei rechts Nullen nachrücken.

1<<3:
Ausgangswert ist 1, also 00000001
3 Stellen nach links geschoben ist 00001000

0<<3:
Ausgangswert ist 0, also 00000000
3 Stellen nach links geschoben ist 00000000

13<<3:
Ausgangswert ist 13, also 00001101
3 Stellen nach links geschoben ist 01101000

Lightstorm
09.03.2010, 14:34
Jetzt sollte es geklärt sein. Dass die Null (0<<3) so eigentlich kein Sinn macht, war mir so nicht klar.

Gibt es auch eine Variante, an der statt 0er, 1er nachrücken?

Danke für die Hilfe...