Technische Informatik; Hardwarenahe Programmierung
Bitmanipulationen Grundlegend
Maskieren und Verschieben¶
Das folgende Programm maskiert das untere Nibble wie in der Beschreibung. Kopiere das Programm in den mbed-Simulator und kontrolliere die vier blauen Leds.
#include "mbed.h" BusOut myleds(LED1, LED2, LED3, LED4); void print_binary(uint8_t x) { // function to print binary for(int i=sizeof(x)<<3; i; i--) putchar('0'+((x>>(i-1))&1)); } int main() { uint8_t value = 0b01010110; // C++14 Standard Extension uint8_t mask = 0b00001111; // mask lower nibble uint8_t position = 0; // for later use is position of bit in mask // scanf("%d", &value); printf("value : "); print_binary(value); // call function print_binary printf("\nmask : "); print_binary(mask); value = mask & value; myleds = value; printf("\nresult: "); print_binary(myleds.read()); printf("\n\nshift left: %X\n", value<<1); printf("shift right: %X\n", value>>1); }
Erweitere das obige Programm, sodass alle Nibble der Reihe nach im Sekundentakt auf den Led-Bus ausgegeben werden: value, mask, Ergebnis der Verknüpfung.
Für die folgenden Beispiele bzw. für eine Erklärung von (1 << position) siehe Hilfestellung .
Bit setzen: Bit an der position in der mask setzen und mit value OR verknüpfen:
mask = 1 << position; value = value | mask;
Bit löschen: Bit an der position in der mask setzen und value mit der bitweisen negierten mask AND verknüpfen:
mask = 1 << position; value = value & ~mask;
Bit toggeln: Bit an der position in der mask setzen und mit value EXOR verknüpfen:
mask = 1 << position; value = value ^ mask;
Bit abfragen: ob das Bit an der position in value gesetzt ist; ergibt 1 (true), wenn Bit = 1 und 0 (false) wenn 0
value >>= position; if((value & 1) != 0) // code
Anm: für >>= siehe Compound assignment operators - a >>= b entspricht a = a >> b.
Aufgaben¶
Information
Veröffentlichen Sie das jeweils fertige Programm aus dem mbed-Compiler mit dem Programm-Namen aus den [eckigen Klammern] nach der fortlaufenden Nummer
ODER
wenn Sie die Programme im mbed-Simulator schreiben, erzeugen Sie eine entsprechende WIKI-Seite mit kurzer Programmbeschreibung und dem Code (siehe WIKI-Syntax) mit Titel aus den [eckigen Klammern].
0. Aufgabe: [LaufShift]] Programmiere ein Lauflicht für die vier blauen Leds mit BusOut und Verschiebe Operatoren.
1. Aufgabe: [SetDelTogBits] Schreibe ein Programm das folgende Tasks beinhaltet:
- Lösche (0) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint8_t.
- Setze (1) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint16_t.
- Toggle (0 wird 1 bzw. 1 wird 0) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint32_t.
- Lösche/Setze/Toggle das 3. und das 5. Bit beim Datentype uint8_t.
Siehe Hilfestellung.
Beispiel für das Extrahieren (Verschieben und Maskieren) der 4 Bytes aus einer 32 Bit Integer Zahl (& und >>):
uint32_t value = 0x01020304 //Example value uint32_t byte1 = (value >> 24); //0x01020304 >> 24 is 0x01 so //no masking is necessary uint32_t byte2 = (value >> 16) & 0xff; //0x01020304 >> 16 is 0x0102 so //we must mask to get 0x02 uint32_t byte3 = (value >> 8) & 0xff; //0x01020304 >> 8 is 0x010203 so //we must mask to get 0x03 uint32_t byte4 = value & 0xff; //here we only mask, no shifting
2. Aufgabe: [ByteShift] Schreibe mit obigen Code ein vollständiges Programm im mbed-Simulator und kontrolliere die Werte.
Nachfolgend ein Programm für das Verschieben:
bit-shift.cpp
#include "mbed.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); uint8_t pos = 0; uint8_t shift = 3; // change the value between 0 and 3 int main() { while (1) { pos = (1 << shift); // shift left printf("%d\n", pos); if(pos == 0b00001000) led4 = !led4; if(pos == 0b00000100) led3 = !led3; if(pos == 0b00000010) led2 = !led2; if(pos == 0b00000001) led1 = !led1; wait_ms(500); } }
3. Aufgabe:
[BinHexDezVergl] Schreibe das Programm so um, dass an Stelle des Vergleichs mit binären Konstante, hex bzw. dezimale Werte verwendet werden.
Erweitert: wie im Beispiel am Anfang ein BusOut für die Leds verwendet wird.