Da niemand das Thema angesprochen hat, warum diese nützlich sind:
Ich benutze oft bitweise Operationen, wenn ich mit Flags arbeite. Wenn Sie beispielsweise eine Reihe von Flags an eine Operation übergeben möchten (z. B. wenn File.Open()
sowohl der Lesemodus als auch der Schreibmodus aktiviert sind), können Sie sie als einzelnen Wert übergeben. Dies wird erreicht, indem jedem möglichen Flag ein eigenes Bit in einem Bitset zugewiesen wird (Byte, Short, Int oder Long). Beispielsweise:
Read: 00000001
Write: 00000010
Wenn Sie also Lesen UND Schreiben übergeben möchten, übergeben Sie (READ | WRITE), in dem die beiden kombiniert werden
00000011
Was dann am anderen Ende entschlüsselt werden kann wie:
if ((flag & Read) != 0) { //...
welche prüft
00000011 &
00000001
was zurückkehrt
00000001
Dies ist nicht 0, daher gibt das Flag READ an.
Sie können XOR verwenden, um verschiedene Bits umzuschalten. Ich habe dies verwendet, wenn ich ein Flag zum Festlegen von Richtungseingaben (Auf, Ab, Links, Rechts) verwendet habe. Zum Beispiel, wenn sich ein Sprite horizontal bewegt und ich möchte, dass es sich umdreht:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Ich XOR einfach den aktuellen Wert mit (LINKS | RECHTS), wodurch in diesem Fall LINKS aus und RECHTS eingeschaltet wird.
Bitverschiebung ist in mehreren Fällen nützlich.
x << y
ist das gleiche wie
x * 2 y
Wenn Sie schnell mit einer Zweierpotenz multiplizieren müssen, aber darauf achten müssen, dass ein 1-Bit in das obere Bit verschoben wird, wird die Zahl negativ, es sei denn, sie ist ohne Vorzeichen. Dies ist auch nützlich, wenn Sie mit unterschiedlichen Datengrößen arbeiten. Beispiel: Lesen einer Ganzzahl aus vier Bytes:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Angenommen, A ist das höchstwertige Byte und D das niedrigste. Es würde enden als:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Farben werden häufig auf diese Weise gespeichert (wobei das höchstwertige Byte entweder ignoriert oder als Alpha verwendet wird):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Um die Werte wieder zu finden, verschieben Sie einfach die Bits nach rechts, bis sie unten sind, und maskieren Sie dann die verbleibenden Bits höherer Ordnung:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
ist das gleiche wie 11111111
. Für Red würden Sie also im Wesentlichen Folgendes tun:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)