Eine Maske ist eine gebräuchliche Bezeichnung für einen ganzzahligen Wert, der bitweise ANDed, ORed, XORed usw. mit einem anderen ganzzahligen Wert ist.
Wenn Sie beispielsweise die 8 niedrigstwertigen Ziffern einer int-Variablen extrahieren möchten, tun Sie variable & 0xFF
. 0xFF ist eine Maske. Wenn Sie die Bits 0 und 8 setzen möchten, müssen Sie variable | 0x101
eingeben, wobei 0x101 eine Maske ist.
Oder wenn Sie die gleichen Bits invertieren möchten, tun Sie variable^0x101
, wobei 0x101 eine Maske ist.
Um eine Maske für Ihren Fall zu generieren, sollten Sie die einfache mathematische Tatsache ausnutzen, wenn Sie 1 zu Ihrer Maske hinzufügen (die Maske hat alle niedrigstwertigen Bits auf 1 gesetzt und der Rest auf 0), erhalten Sie einen Wert ist eine Potenz von 2.
Also, wenn Sie die nächste Potenz von 2 generieren, dann können Sie 1 davon abziehen, um die Maske zu erhalten.
Positive Potenzen von 2 sind leicht mit dem linken Schiebe <<
Operator in C. erzeugt
Daher 1 << n
Ausbeuten 2 n. Im Binärformat ist es 10 ... 0 mit n
0s.
(1 << n) - 1
wird eine Maske mit n
niedrigsten Bits auf 1
Nun setzen produzieren, müssen Sie in der linken Verschiebungen bei Überflutungen achten. In C (und in C++) können Sie eine Variable nicht um so viele Bitpositionen verschieben, wie die Variable hat. Wenn also Ints 32-Bit sind, wird 1<<32
in undefined behavior
zurückgegeben. Vorzeichenbehaftete ganzzahlige Überläufe sollten ebenfalls vermieden werden, daher sollten Sie vorzeichenlose Werte verwenden, z. 1u << 31
.
* auch, was eine Maske * [Wie wäre Wikipedia?] (Http://en.wikipedia.org/wiki/Mask_? (Computer)) – chris
Die 0x2F ist übrigens falsch, es sollte 0x3f sein – wich
@chris wiki ist zu Verwirrung ... – sebi