2012-05-08 4 views
86

Ich bin ziemlich neu in der 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.Was ist Bitmaskierung?

+0

Verstehen Sie bitweise Operatoren wie & |^usw. und Boolesche Logik im Allgemeinen? Jede Erläuterung von Maskenoperationen erfordert dies. –

+0

Ja, ich habe ein Verständnis von bitweisen Operatoren, und boolesche Logik –

+1

Ich weiß, Links sollten nicht veröffentlicht werden, aber Wikipedia Erklärung ist großartig: https://en.wikipedia.org/wiki/Mask_(computing) – pevik

Antwort

126

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

Maskieren ist das Auslösen einer Maske auf einen Wert. Dies wird erreicht, indem:

  • bitweise AND-Operation, um eine Teilmenge der Bits in dem Wert zu extrahieren
  • bitweise ODER-Verknüpfung, um eine Teilmenge der Bits in dem Wert
  • bitweise XOR-Verknüpfung zu setzen, um eine Teilmenge der Bits in dem Wert

Below zu wechseln ist ein Beispiel einer Teilmenge der Bits in dem Wert des Extrahierens:

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 (unteren) 4 Bits beibehalten möchten. Also haben wir die unteren 4 Bits extrahiert. Das Ergebnis ist:

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

Maskierung implementiert mit AND, so in C erhalten wir:

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

Hier ist ein ziemlich häufiger Anwendungsfall: Extrahieren von einzelnem Bytes aus einem größeren Wort. Wir definieren die höherwertigen Bits in dem Wort als das erste Byte. Wir verwenden dafür zwei Operatoren, &, und >> (nach rechts). Dies ist, wie können wir die vier Bytes von einem 32-Bit-Integer-Extrakt:

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 die Reihenfolge der Operatoren oben wechseln könnte, müssen Sie zuerst die Maske tun könnte, dann die Verschiebung. Die Ergebnisse sind die gleichen, aber jetzt müssten Sie eine andere Maske verwenden:

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

Gute Antwort aber Maskierung kann auch für das * Setzen * oder * Umschalten * bestimmter Bits mit ODER- oder XOR-Operationen und einer geeigneten Maske angewendet werden. –

+0

@ user239558 danke für das Beispiel und die richtige Syntax. @ Paul R. Würde ich einfach sagen Maske UND Wert in dem Beispiel von user239558 –

+0

@ Mr.Z: in C, C++ und verwandte Sprachen Sie würden Sie die ** bitweise AND ** -Operator, der als '&' geschrieben wird. –