아무도 왜 이것이 유용한 지에 대한 주제를 밝히지 않았습니다.
플래그로 작업 할 때 비트 연산을 많이 사용합니다. 예를 들어, 일련의 플래그를 작업에 전달하려는 경우 (예 : File.Open()
읽기 모드와 쓰기 모드가 모두 활성화 된 경우) 단일 값으로 전달할 수 있습니다. 이는 가능한 각 플래그를 비트 세트 (바이트, short, int 또는 long)로 자체 비트를 할당하여 수행됩니다. 예를 들면 다음과 같습니다.
Read: 00000001
Write: 00000010
따라서 읽기 및 쓰기를 전달하려면 (READ | WRITE)를 전달한 다음 두 가지를 결합합니다.
00000011
그런 다음 다른 쪽 끝에서 해독 할 수 있습니다.
if ((flag & Read) != 0) { //...
어떤 검사
00000011 &
00000001
어떤 반환
00000001
0이 아니므로 플래그는 READ를 지정합니다.
XOR을 사용하여 다양한 비트를 토글 할 수 있습니다. 플래그를 사용하여 방향 입력 (위, 아래, 왼쪽, 오른쪽)을 지정할 때 이것을 사용했습니다. 예를 들어 스프라이트가 가로로 움직이고 있고 돌아 서고 싶은 경우 :
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
이 경우에는 LEFT를 끄고 오른쪽으로 켜는 (LEFT | RIGHT)로 현재 값을 XOR합니다.
비트 이동은 여러 경우에 유용합니다.
x << y
와 같다
x * 2 년
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)