! 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.