これらが有用である理由について誰も触れていないので:
フラグを操作するときは、ビット演算をよく使用します。たとえば、一連のフラグをオペレーションに渡したい場合(たとえば、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)