Technische Informatik; Hardwarenahe Programmierung

Bitmanipulationen Grundlegend

Inhalt

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:

  1. Lösche (0) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint8_t.
  2. Setze (1) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint16_t.
  3. Toggle (0 wird 1 bzw. 1 wird 0) das LSB (least significant bit), MSB (most significant bit) beim Datentype uint32_t.
  4. 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.


All wikipages