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.