1.1b 🚧🏋️ Bitschubserei

Synopsis: [MezData: Ausdrücke und Operatoren] [SPS-Logik-Simulation]

Sobald mehrere Port-Pins auf einmal gelesen oder gesetzt werden sollen wird es mit digitalWrite() und digitalRead() umständlich, ausserdem brauchen diese Operationen deutlich länger als der direkte Zugriff über die Portregister.
Hinweise: Zur Veranschaulichung habe ich hier unsigned char a; // 8 Bit ohne Vorzeichen (uint8_t) verwendet. In den [] Klammern stehen Ausdrücke mit dem gleichen Effekt.

Bits verschieben (Bitshift)

Jede Stelle nach links schieben << multipliziert mit 2. Jede Stelle nach rechts schieben >> dividiert durch 2, Nachkommastellen werden abgeschnitten.

Ausdruckuint8_t aErgebnis
a<<1 [= a*2] [= a*21]0b0000 1010 (10)0b0001 0100 (20)
a>>1 [= a/2] [= a/21]0b0000 0101 (5)0b0000 0010 (2)
a<<3 [= a*8] [= a*23]0b0000 1010 (10)0b0101 0000 (64+16=80)
a>>4 [= a/16] [= a/24]0b1111 1111 (255=0xFF)0b0000 1111 (15=0x0F)
Mit << und >> können Bits verschoben werden
Anwendung für Bitshift
Anwendung für Bitshift

Beispiel für Anwendung: Leuchtband
Beachte die Notwendigkeit der Klammern siehe 1.1s Spickzettel Operanden und Ausführungsprioritäten

GPIOC->ODR = (GPIOC->ODR<<1)+1; // Leuchtband erweitern
GPIOC->ODR = GPIOC->ODR>>1;     // Leuchtband reduzieren

Maskieren mit & (bitweises &)

Ausdruckuint8_t aErgebnis
a & 1 [= a%2]0b1111 1111 (255=0xFF)0b0000 0001 (1)
a & 3 [= a%4]0b1111 1111 (255=0xFF)0b0000 0011 (3)
a&0b1010 [= a&10]0b1111 1101 (253=0xFD)0b0000 1000 (8)
a&1<<2 [= a&0b100]0b1111 1111 (255=0xFF)0b0000 0100 (4)
Mit & können Bits maskiert, ausgeblendet werden

Bits setzen mit |, |= (bitweises |)

Ausdruckuint8_t aErgebnis
a|1 [= a|0b1]0b0000 00000b0000 0001 (1)
a|2 [= a|0b10]0b0000 0001 (1)0b0000 0011 (3)
a | 1<<1 [= a|0b10]0b0000 00000b0000 0010 (2)
a | 0b101<<2 [= a|0b10100] [= a | 5*4]0b0000 00000b0001 0100 (20)
Mit | können Bits gesetzt werden

Bits rücksetzen mit &, &= (bitweises &)

Mit ~ werden die Bits im Ausdruck invertiert, dazu muss der Datentyp berücksichtigt werden, hier sind es 8 Bit, Beispiele für Datentypen:

  • 8 Bit: ~1 = 0xFE = 0b1111 1110
  • 16 Bit: ~1 = 0xFFFE = 0b1111 1111 1111 1110
  • 32 Bit: ~1 = 0xFFFFFFFE = 0b1111 1111 1111 1111 1111 1111 1111 1110
Ausdruckuint8_t aErgebnis
a & ~1 [= a&~0b01] [= a & 0b1111 1110]0b1111 1111 (255=0xFF)0b1111 1110 (254=0xFE)
a & ~2 [= a&~0b10] [= a & 0b1111 1101]0b1111 1111 (255=0xFF)0b1111 1101 (253=0xFD)
a & ~(1<<3) [= a & ~0b1000] [= a & 0b1111 01111]0b1111 1111 (255=0xFF)0b1111 0111 (247=0xF7)
a & ~(0b101<<2) [= a & ~0b1 0100] [= a & 0b1110 1011]0b1111 1111 (255=0xFF)0b1110 1011 (235=0xEB)
Mit & und ~ können Bits zurückgesetzt werden

Bits invertieren mit ^, ^= (bitweises exor)

Ausdruckuint8_t aErgebnis
a ^1 [= a^0b01]0b1111 1111 (255=0xFF)
0b0000 0000
0b1111 1110 (254=0xFE)
0b0000 0001
a ^2 [= a^0b10]0b1111 1111 (255=0xFF)
0b0000 0000
0b1111 1101 (253=0xFD)
0b0000 0010
a ^(1<<3) [= a ^0b1000]0b1111 1111 (255=0xFF)0b1111 0111 (247=0xF7)
a ^(0b101<<2) [= a ^0b1 0100]0b1111 1111 (255=0xFF)0b1110 1011 (235=0xEB)
Mit ^ können Bits invertiert werden

ToDo: Programm in Java, JavaScript, Python zur Überprüfung erstellen.

Beispiel für Anwendung 1.1 SPS-Logik-Simulation

Ein Kommentar

Kommentare sind geschlossen.