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.
Ausdruck | uint8_t a | Ergebnis |
---|---|---|
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) |
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 &)
Ausdruck | uint8_t a | Ergebnis |
---|---|---|
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) |
Bits setzen mit |, |= (bitweises |)
Ausdruck | uint8_t a | Ergebnis |
---|---|---|
a|1 [= a|0b1] | 0b0000 0000 | 0b0000 0001 (1) |
a|2 [= a|0b10] | 0b0000 0001 (1) | 0b0000 0011 (3) |
a | 1<<1 [= a|0b10] | 0b0000 0000 | 0b0000 0010 (2) |
a | 0b101<<2 [= a|0b10100] [= a | 5*4] | 0b0000 0000 | 0b0001 0100 (20) |
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
Ausdruck | uint8_t a | Ergebnis |
---|---|---|
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) |
Bits invertieren mit ^, ^= (bitweises exor)
Ausdruck | uint8_t a | Ergebnis |
---|---|---|
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) |
ToDo: Programm in Java, JavaScript, Python zur Überprüfung erstellen.
Beispiel für Anwendung 1.1 SPS-Logik-Simulation
Ein Kommentar
Kommentare sind geschlossen.