Franz Pucher / TINF

You are viewing an older revision! See the latest version

Bitmanipulationen Grundlegend

Table of Contents

  1. Maskieren
  2. Aufgaben

Inhalt

Maskieren

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);

int main() {
    uint8_t value = 0x55;  // 01010101b
    uint8_t mask = 0x0f;   // 00001111b mask lower nibble
    uint8_t position = 0;  // for later use is position of bit in mask

    while(1) {
        // scanf("%d", &value);
        value = mask & value;
        myleds = value;
        printf("%x\n", value);
        wait(0.25);
    }
}

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

Aufgaben

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

1. Aufgabe: 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);
    }
}

2. Aufgabe: Schreibe das Programm so um, dass wie im 1. Beispiel ein BusOut für die Leds verwendet wird.


All wikipages