it-swarm-eu.dev

Was ist Bitmaskierung?

Ich bin ziemlich neu in C-Programmierung, und ich stieß auf Bit-Maskierung. Kann mir jemand das allgemeine Konzept und die Funktion der Bitmaskierung erklären? Beispiele werden sehr geschätzt.

148
Mr.Z

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

Beim Maskieren wird eine Maske auf einen Wert angewendet. Dies wird erreicht durch:

  • Bitweises UND, um eine Teilmenge der Bits im Wert zu extrahieren
  • Bitweises ODER, um eine Teilmenge der Bits im Wert festzulegen
  • Bitweises XORing, um eine Teilmenge der Bits im Wert umzuschalten

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

Mask:   00001111b
Value:  01010101b

Wenn Sie die Maske auf den Wert anwenden, möchten Sie die ersten (höheren) 4 Bits löschen und die letzten (niedrigeren) 4 Bits beibehalten. Damit haben wir die unteren 4 Bits extrahiert. Das Ergebnis ist:

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

Die Maskierung wird mit AND implementiert. In C erhalten wir also:

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

Hier ist ein ziemlich häufiger Anwendungsfall: Extrahieren einzelner Bytes aus einem größeren Wort. Wir definieren die höherwertigen Bits im Wort als erstes Byte. Wir benutzen dazu zwei Operatoren, &, und >> (Verschiebung nach rechts). 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önnen, zuerst die Maske, dann die Verschiebung. Die Ergebnisse sind die gleichen, aber jetzt müssten Sie eine andere Maske verwenden:

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

Maskieren bedeutet, einen gewünschten Teil der Information zu behalten/zu ändern/zu entfernen. Sehen wir uns eine Bildmaskierungsoperation an. wie- diese Maskierungsoperation entfernt alles, was nicht haut-

enter image description here

In diesem Beispiel wird die Operation [~ # ~] und [~ # ~] ausgeführt. Es gibt auch andere Maskierungsoperatoren - [~ # ~] oder [~ # ~] , [~ # ~] oder [~ # ~] .


Bit-Maskierung bedeutet, dass die Bits maskiert werden. Hier ist eine Bit-Maskierung 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]

Es bleiben also nur die mittleren 4 Bits (da diese Bits in dieser Maske 1 Sind).

Sehen wir das mit [~ # ~] xoder [~ # ~] -

     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]

Nun werden die mittleren 4 Bits umgedreht (1 Wurde zu 0, 0 Wurde zu 1).


Mit der Bitmaske können wir also auf einzelne Bits zugreifen [ Beispiele ]. Manchmal kann diese Technik auch zur Leistungsverbesserung eingesetzt werden. Nehmen Sie dies zum Beispiel

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

Diese Funktion gibt an, ob eine Ganzzahl ungerade/gerade ist. Wir können das gleiche Ergebnis mit mehr Effizienz erzielen, wenn wir

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

Kurze Erklärung : Wenn das niedrigstwertige Bit einer Binärzahl 1 Ist, ist es ungerade; für 0 wird es gerade sein. Wenn wir also [~ # ~] und [~ # ~] mit 1 Ausführen, entfernen wir alle anderen Bits mit Ausnahme des niedrigstwertigen Bits, d.h.

     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]
29
Minhas Kamal