誰もこれらがなぜ有用であるかという主題を破ったことがないので:
フラグを操作するときは、ビット演算をよく使用します。たとえば、一連のフラグを操作に渡したい場合(たとえば、File.Open()
読み取りモードと書き込みモードの両方が有効になっている場合)、それらを単一の値として渡すことができます。これは、可能な各フラグにビットセット内の独自のビット(byte、short、int、またはlong)を割り当てることによって実現されます。例えば:
Read: 00000001
Write: 00000010
したがって、読み取りと書き込みを渡す場合は、(READ | WRITE)を渡すと、2つが次のように結合されます。
00000011
次に、次のようにもう一方の端で復号化できます。
if ((flag & Read) != 0) { //...
チェックする
00000011 &
00000001
これは
00000001
これは0ではないため、フラグはREADを指定します。
XORを使用して、さまざまなビットを切り替えることができます。フラグを使用して方向入力(上、下、左、右)を指定するときにこれを使用しました。たとえば、スプライトが水平方向に移動していて、向きを変えたい場合は、次のようにします。
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
現在の値を(LEFT | RIGHT)とXORするだけで、この場合はLEFTがオフになりRIGHTがオンになります。
ビットシフトはいくつかの場合に役立ちます。
x << y
と同じです
x * 2 y
2の累乗ですばやく乗算する必要があるが、1ビットを最上位ビットにシフトすることに注意する必要がある場合-これにより、符号なしでない限り、数値は負になります。さまざまなサイズのデータを処理する場合にも役立ちます。たとえば、4バイトから整数を読み取る場合:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Aが最上位バイトで、Dが最下位であると仮定します。最終的には次のようになります。
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
多くの場合、色は次のように保存されます(最上位バイトは無視されるか、アルファとして使用されます)。
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
値を再度見つけるには、ビットを右にシフトして一番下になるようにしてから、残りの上位ビットをマスクします。
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
と同じ11111111
です。つまり、基本的に、Redの場合、次のようになります。
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)