Was ist Bitmaskierung?

Lesezeit: 4 Minuten

Benutzeravatar von Mr.Z
Herr Z

Ich bin ziemlich neu in der C-Programmierung und bin auf Bitmaskierung gestoßen. Was ist das allgemeine Konzept und die Funktion der Bitmaskierung?

Beispiele werden sehr geschätzt.

Benutzeravatar von user239558
Benutzer239558

Eine Maske definiert, welche Bits Sie behalten möchten und welche Bits Sie löschen möchten.

Maskieren ist das Anwenden einer Maske auf einen Wert. Dies wird erreicht, indem Sie Folgendes tun:

  • Bitweises ANDing, um eine Teilmenge der Bits im Wert zu extrahieren
  • Bitweises ORing, um eine Teilmenge der Bits im Wert zu setzen
  • Bitweises XORing, um eine Teilmenge der Bits im Wert umzuschalten

Unten ist ein Beispiel für das Extrahieren einer Teilmenge der Bits im Wert:

Mask:   00001111b
Value:  01010101b

Das Anwenden der Maske auf den Wert bedeutet, dass wir die ersten (höheren) 4 Bits löschen und die letzten (niedrigeren) 4 Bits behalten möchten. Somit haben wir die unteren 4 Bits extrahiert. Das Ergebnis ist:

Mask:   00001111b
Value:  01010101b
Result: 00000101b

Die Maskierung wird mit AND implementiert, also erhalten wir in C:

uint8_t stuff(...) {
  uint8_t mask = 0x0f;   // 00001111b
  uint8_t value = 0x55;  // 01010101b
  return mask & value;
}

Hier ist ein ziemlich häufiger Anwendungsfall: Einzelne Bytes aus einem größeren Wort extrahieren. Wir definieren die höherwertigen Bits im Wort als erstes Byte. Wir verwenden dafür zwei Operatoren, &und >> (nach rechts verschieben). So können wir die vier Bytes aus einer 32-Bit-Ganzzahl extrahieren:

void more_stuff(uint32_t value) {             // Example value: 0x01020304
    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
                                              // is necessary
    ...
}

Beachten Sie, dass Sie die Reihenfolge der obigen Operatoren ändern könnten, Sie könnten zuerst die Maske und dann die Verschiebung ausführen. Die Ergebnisse sind die gleichen, aber jetzt müssten Sie eine andere Maske verwenden:

uint32_t byte3 = (value & 0xff00) >> 8;

  • Gute Antwort, aber Maskierung kann auch beantragt werden Einstellung oder Umschalten bestimmte Bits mit OR- oder XOR-Operationen und einer geeigneten Maske.

    – PaulR

    8. Mai 2012 um 6:28 Uhr

  • @Mr.Z: in C, C++ und verwandten Sprachen würdest du dir das bitweises UND Operator, der geschrieben wird als &.

    – PaulR

    8. Mai 2012 um 6:45 Uhr

  • @Mr.Z Zum Beispiel: Löschen Sie ein Byte von uint32_t, indem Sie den Inhalt maskieren: #define MASK 0x000000FF .... my_uint32_t &= ~MASK.

    – Ludin

    8. Mai 2012 um 7:31 Uhr

  • das b um anzuzeigen, dass das binäre Literal nicht von allen Compilern unterstützt wird, richtig?

    – Ungeheuer

    8. Mai 2017 um 23:37 Uhr


  • Ein Teil der Verwirrung entsteht möglicherweise aufgrund der schlechten Wahl von Substantiven und Verben, um zu beschreiben, was wirklich vor sich geht. Wäre zum Beispiel ein Wort wie “Bitselector” oder “TargetBits” nicht ein geeigneteres Wort, um das Objekt zu beschreiben, anstatt das Wort “Bitmaske” zu verwenden? Um die Bitmanipulationsoperationen zu beschreiben, scheint die Verwendung von Wörtern wie “BitManipulate” ein geeigneteres Wort zu sein als das Wort “Masking”, da letzteres nur für AND-Operationen sinnvoll ist, nicht jedoch für XORING (Toggle Bits) oder OR (Set Bits). sind eher Bitmanipulationen oder -transformationen, aber keine Maskierungsoperationen.

    – Nurabha

    26. Juni 2019 um 9:28 Uhr


Benutzeravatar von Minhas Kamal
Minhas Kamal

Maskieren bedeutet, einen gewünschten Teil der Informationen zu behalten, zu ändern oder zu entfernen. Sehen wir uns eine Bildmaskierungsoperation an. wie diese Maskierungsoperation alles entfernt, was keine Haut ist:

Geben Sie hier die Bildbeschreibung ein

Wir machen eine UND Betrieb in diesem Beispiel. Es gibt auch andere Maskierungsoperatoren—ODER und XOR.


Bitmaskierung bedeutet, Bits eine Maske aufzuerlegen. Hier ist eine Bitmaskierung mit UND

     1 1 1 0 1 1 0 1     input
(&)  0 0 1 1 1 1 0 0      mask
------------------------------
     0 0 1 0 1 1 0 0    output

Also nur die mittleren vier Bits (so wie diese Bits sind 1 in dieser Maske) verbleiben.

Sehen wir uns das mal an XOR

     1 1 1 0 1 1 0 1     input
(^)  0 0 1 1 1 1 0 0      mask
------------------------------
     1 1 0 1 0 0 0 1    output

Jetzt werden die mittleren vier Bits umgedreht (1 wurde 0, 0 wurde 1).


Über eine Bitmaske können wir also auf einzelne Bits zugreifen (Beispiele). Manchmal kann diese Technik auch zur Leistungssteigerung eingesetzt werden. Nehmen Sie dies zum Beispiel-

bool isOdd(int i) {
    return i%2;
}

Diese Funktion gibt an, ob eine ganze Zahl ungerade/gerade ist. Wir können das gleiche Ergebnis effizienter mit einer Bitmaske erzielen –

bool isOdd(int i) {
    return i&1;
}

Kurze Erklärung: Wenn die niedrigstwertige Bit einer Binärzahl ist 1 dann ist es seltsam; zum 0 es wird gleichmäßig sein. Also, indem Sie es tun UND mit 1 Wir entfernen alle anderen Bits mit Ausnahme des niederwertigsten Bits, dh:

     55  ->  0 0 1 1 0 1 1 1     input
(&)   1  ->  0 0 0 0 0 0 0 1      mask
---------------------------------------
      1  <-  0 0 0 0 0 0 0 1    output

  • Auch um eine ganze Zahl in eine ungerade Zahl umzuwandeln. wenn es eine gerade Zahl ist: i=i|1. Dies ist praktisch, wenn wir versuchen, eine Sequenz wie 1, 3, 5, …, 2, 4, 6, … zu generieren.

    – Harshit Sharma

    6. März 2019 um 19:47 Uhr

  • Sie können auch die folgende Operation verwenden, um die Zahl mit nur dem niederwertigsten Bit einer Ganzzahl zu finden: lsb = i&-i

    – Harshit Sharma

    6. März 2019 um 20:06 Uhr


1426500cookie-checkWas ist Bitmaskierung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy