Bitwise AND (Mikrocontroller-Programmierung)?

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
afferty 
Fragesteller
 18.04.2024, 13:51

Das stimmt nicht. Dann würde mein ganzer Code nicht funktionieren, wenn das so wäre. Der füllt alle Bits davor mit 0

0
afferty 
Fragesteller
 18.04.2024, 13:54

Außerdem shifte ich den Vergleichswert bzw. den 2. Operator des AND

0
JanaL161  18.04.2024, 13:55
@afferty

Ah, wie wäre es mit klammern um 1 << POS?
if((GROUP->REG & (1 << POS)) == 1) {action}

Ich denke, das Mysterium mit == 1 kommt daher, dass if alle Werte außer null akzeptiert, ==1 nur exakt 1.

0
JanaL161  18.04.2024, 14:07
@JanaL161

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.

1
afferty 
Fragesteller
 18.04.2024, 14:53
@JanaL161

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

0