Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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.