Bitwise AND (Mikrocontroller-Programmierung)?
Ich checke in einer if-Bedingung den Wert eines Bits in einem Register:
Bei dieser Bedingung weißt mich meine IDE darauf hin, dass diese nie wahr werden kann? Ich verstehe aber nicht warum. Denn wenn ich den Vergleich mit "ist es 1" weglasse, dann wird die Bedingung wahr? Aber wenn ich den Vergleich weglasse, heißt es doch auch nur: das if wird true,1,wahr wie auch immer wenn eine 1 herauskommt und false,0,falsch wenn eine 0 herrauskommt? Wieso funktioniert es dann nicht, wenn ich noch den Vergleicher zusätzlich hinschreibe?
Hab ich evtl. einen Denkfehler?
if((GROUP->REG & 1 << POS) == 1) {action}
2 Antworten
Schau dir nochmal die Rangfolge der Operatoren an.
Möglicherweise musst du um GROUP->REG noch eine Klammer setzen.
Kann es sein, dass du `>>` verwenden willst?
`<<` füllt den Bit, welchen du testest, immer mit null.
#include <stdio.h>
int main(void) {
int x = 0b101;
printf("%b\n", x);
printf("%-4b | %b\n", x << 1, (x << 1) & 1);
printf("%-4b | %b\n", x >> 2, (x >> 2) & 1);
return 0;
}
.
101
1010 | 0
1 | 1
Ah. So langsam verstehe ich.
if((GROUP->REG & 1 << POS) == 1) {action}
Okay, du brauchst keine klammern. Erst wird 1 << POS ausgeführt, dann &.
So, nun haben wir mit POS = 2, 1 << 2 = 0b100. Den Bit testest du dann in REG. Bekommst also 0 oder 0b100. Das kannst du aber nicht mit == 1 testen. Einfach == 1 weglassen, dann klappt es.
Oder halt ((REG >> POS) & 1) == 1.
Ah, daran hatte ich nicht gedacht, dass ja auch binäres Format rauskommt🤦♂️
Dann macht ja auch Sinn, warum == 1 nicht geht. Und dein letztes mit REG>>POS wird glaube ich nicht gehen, denn was passiert bei left-shift mit den Bits die rechts von der Position sind wohin ich schiebe? Aber mit dem right-shift ist es für mich logischer, denn die Register beginnen auch immer rechts mit Bit 0
Das stimmt nicht. Dann würde mein ganzer Code nicht funktionieren, wenn das so wäre. Der füllt alle Bits davor mit 0
Außerdem shifte ich den Vergleichswert bzw. den 2. Operator des AND