Konkret im code würde das jetzt vlt. so aussehen:
gefällt Dir das besser?
1
>if(u16CPU_RegisterAHBP&~SPI_FLAG_CS)
2
>
3
>if(!(u16CPU_RegisterAHBP&SPI_FLAG_CS))
4
>
Die Tücke beim ersten ist, dass das nur funktioniert, wenn im Register noch andere Bit wie das gesuchte gesetzt sind. Ist das Register = 0x00, dann ergibt sich
if (0 & ~SPI_FLAG_CS)... also
if (0) ... wird also nicht betreten, obwohl das gesuchte Bit nicht gesetzt ist.
Mit BIT_1 meine ich wirklich BIT1, keine "willkürliche" variable...
BIT_1 ist 0x01.
Es spielt keine Rolle, ob BIT_1 nur 1 Bit gesetzt hat oder mehrere. Wenn es für 0x01 nicht funktioniert, dann findet man auch Fälle, so dass es für 0x02 nicht funktioniert: Man braucht nur Bit 0 mit Bit 1 zu tauschen.
Mach doch einfach mal ein Programm, dann siehst du dass die Bedingungen nicht äquivalent sind:
welche der beiden Variationen würdet Ihr verwenden und wieso?
Das kommt drauf an, was du erreichen willst. Fest steht, dass die beiden Ausdrücke ein völlig verschiedenes Ergebnis liefert. Guck dir die Minimalversion mit je zwei Bit an.
Normalerweise brütet man konzentriert über eine Wertetabelle, probiert ein paar Zusammenhänge aus, ..und weiß hinterher einigermaßen, was zu tun ist bzw. wie gewisse Zusammenhänge und Sonderzeichen im Bool-Zusammenhang einzuordnen sind.
Typische Boolzusammehänge sind auch nicht immer so leicht auf einen Blick zu verstehen. Weswegen Papier und Bleistift auch eine (sehr) gute Hilfe sein können.
Ja, war einfach schnell hin getippt. Doch genau darauf kam es bei der Frage aber auch gar nicht an. Sondern nur zur Verdeutlichung, dass man ein Bit an verschiedenen Positionen haben kann!
Manchmal möchte man sich einen "aufgeräumten" boolschen Wert sichern. Und ›0‹ oder ›1‹ passt dann sogar in ein u_int8 hinein. Oder, auch schön, in ein Bitfield.
Aber wie immer kann man die Aufgabe natürlich auf zig Arten lösen.
Und ›0‹ oder ›1‹ passt dann sogar in ein u_int8 hinein.
bool passt auch in 8 Bit. stdbool.h is your friend. bool wandelt auch gleich noch automatisch alles in true und false um, d.h. der Datentyp kann (wenn man ihn nicht irgendwo vergewaltigt) nur diese beiden Werte annehmen.
Hallo Jeffrey L.,
sicherlich willst Du mit der Abfrage If (! (var & BIT_1)) ermitteln, ob das Bit mit dem Namen BIT_1 gelöscht ist. Das ist so auch vollkommen richtig.
Die Abfrage mit If (var & ~BIT_1) wäre sogar falsch.
Die Abfrage auf ein gesetztes Bit, wäre also immer
if ( Var & Bit_x )
und die Abfrage, ob ein Bit gelöscht ist, wäre immer
if ( !( Var & Bit_x ) ).
Hierbei sind die Bits dann so definiert:
#define Bit_7 0x80
#define Bit_6 0x40
#define Bit_5 0x20
#define Bit_4 0x10
#define Bit_3 0x08
#define Bit_2 0x04
#define Bit_1 0x02
#define Bit_0 0x01