Hallo Freunde der Sonne, Mein Problem: if(!(PIND & (1<<PIND2))) Ich verstehe den Schritt hier einfach nicht. Kurz zum Hintergrund: PIND nimmt entgegen ( 0 oder 1) ob Taster gedrückt ist oder nicht. PIND2 stellt das 2. Bit dar, an dem hängt der Schalter. Wenn das Bit auf 0 gesetzt ist, ist der Schalter gedrückt. if(!(PIND & (1<<PIND2))) //Wenn das erfüllt ist, ist der Schalter gedrückt. Ich verstehe nur nicht wieso. Meine Vorgehensweise: 1. Phase: Schalter nicht gedrückt => PIND=11111111 if(!(11111111 & 00000100)) if(!(00000100)) Jetzt komme nicht mehr weiter, dachte bitweises UND hat nichts mit Wahrheitswerten zu tun?! Das ist weder 0 noch 1 am Ende. 2. Phase: Schalter gedrückt => PIND = 11111011 if(!(11111011 & 00000100)) if(!(0) if(1) Kann man if(1) mit if(true) gleichsetzen? Eventuell kann mal jemand Klarheit schaffen. Vielen Dank!
if(blubb) ist immer dann wahr wenn der "blubb" ungleich "0" ist. Also auch bei 1,2,4,8,16... Da (PIND & (1<<PIND2)) > 0 ist, wenn PD2 HIGH ist, ist eben auch die Bedingung wahr. Und wenn man "wahr" negiert mit !(PIND & (1<<PIND2)) kommt eben "0" raus.
! ist die logische Negation. Hat also im eigentlichen Sinne nichts mit bitweisen Dingen zu tun. In C sind die logischen Bedingungen so definiert: alles was 0 ist, gilt als logisch falsch - FALSE alles was ungleich 0 ist, gilt als logisch wahr - TRUE Beachte: ungleich 0. Da wird nicht 1 gefordert! > 1. Phase: Schalter nicht gedrückt => PIND=11111111 > > if(!(11111111 & 00000100)) > if(!(00000100)) 00000100 ist ungleich 0. Welcher Zahlenwert das genau ist könnte man ermmitteln, spielt aber im Grunde keine Rolle. Alleine dadurch, dass da ein Bit auf 1 gesetzt ist, wissen wir: das kann nicht die Zahl 0 sein. Bei einer 0 wären alle Bits auf 0. ungleich 0 bedeutet aber - logisch wahr - TRUE. Und nur das ist für das ! entscheidend. Aus Sicht des ! steht da also if( !TRUE ) // lies: nicht TRUE nun, !TRUE (nicht TRUE) ist aber logisch falsch - FALSE. daher steht da if( FALSE ) und daher wird dieser Pfad auch nie genommen. Denn ins if geht es ja nur hinein, wenn der Ausdruck wahr ist. Der springende Punkt ist ganz einfach der, dass es für ein logisches TRUE genügt, wenn irgendein Bit gesetzt ist. Denn alles, was als Zahl gesehen ungleich 0 ist, gilt als logisches wahr (TRUE). Daher ist es auch wichtig, zwischen den logischen und den binären Operationen zu unterscheiden: binär logisch Operation --------------------------------------- & && UND | || ODER ~ ! NICHT ^ EXCLUSIV ODER (da gibt es keine logische Operation dazu die binären Operationen arbeiten auf Bitebene und verknüpfen jeweils die Bitpositionen, das Ergebnis ist wieder ein Bithaufen. Die logischen Operationen bewerten zuerst ihre Operanden ob sie 0 oder nicht 0 (FALSE oder TRUE) sind, das Ergebnis ist entweder FALSE (0) oder TRUE (1). Und in dem Fall kommt dann auch für TRUE eine 1 heraus. 1 ist genauso gut wie jede andere Zahl ungleich 0 und auf irgendetwas muss man sich ja einigen, wenn aus dem System heraus selbst ein Wahrheitswert TRUE generiert werden muss.
Vielen Dank für eure Antworten. Jetzt sind hierbei für mich alle Unklarheiten geklärt.
Karl Heinz Buchegger schrieb: > In C sind die logischen Bedingungen so definiert: > alles was 0 ist, gilt als logisch falsch - FALSE > alles was ungleich 0 ist, gilt als logisch wahr - TRUE Wobei C aber immer 1 als wahr zurück geben muß, also:
1 | y = !!x; |
2 | // x y
|
3 | // -1 1
|
4 | // 0 0
|
5 | // 1 1
|
6 | // 2 1
|
7 | // 3 1 usw.
|
D.h. das hier funktioniert nicht:
1 | if( (PINB & 1) & (PINC & 2) ) |
aber das hier:
1 | if( !!(PINB & 1) & !!(PINC & 2) ) |
Peter
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.