[TIL] 121 [C#] 비트연산자, 비트마스크 (BitMask)
카테고리: Til
BitMask
BitMask
비트마스크는 정수의 비트 단위로 데이터나 상태를 표현하고 조작하는 기법
특정 비트들을 켜거나(1로 설정), 끄거나(0으로 설정), 반전
« » (쉬프트), & (AND), | (OR) 등의 연산을 통해 데이터를 효율적으로 관리할 수 있게 합니다.
AND 연산자 (&)
두 비트가 모두 1일 때만 1을 반환합니다.
1101 0001 & 1011 1011 = 1001 0001
OR 연산자 (|)
두 비트 중 하나라도 1이면 1을 반환합니다.
1101 0001 | 1011 1011 = 1111 1011
XOR 연산자 (^)
두 비트가 서로 다를 때만 1을 반환합니다.
1101 0001 ^ 1011 1011 = 0110 1010
NOT 연산자 (~)
비트 값을 반전시킵니다. (0을 1로, 1을 0으로)
~1101 0001 = 0010 1110
왼쪽 Shift 연산자 («)
비트들을 왼쪽으로 지정한 만큼 이동하고, 오른쪽 빈 자리는 0으로 채웁니다.
1101 0001 << 2 = 0100 0100
오른쪽 Shift 연산자 (»)
비트들을 오른쪽으로 지정한 만큼 이동하고, 왼쪽 빈 자리는 부호 비트로 채웁니다(부호 있는 경우).
1101 0001 >> 2 = 0011 0100
예제
static void Main()
{
int M = Convert.ToInt32( Console.ReadLine());
int bitMask = 0;
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < M; i++)
{
string[] input = Console.ReadLine().Split(' ');
string comment = input[0];
int x = input.Length > 1 ? int.Parse(input[1]) : 0;
switch (comment)
{
case "add":
bitMask |= 1 << (x - 1);
break;
case "remove":
bitMask &= ~(1 << (x - 1));
break;
case "check":
stringBuilder.AppendLine((bitMask & (1 << (x - 1))) != 0 ? "1":"0");
break;
case "toggle":
bitMask ^= 1 << (x - 1);
break;
case "all":
bitMask = (1 << 20) - 1;
break;
case "empty":
bitMask = 0;
break;
default: break;
}
}
}
잡담, 일기?
11723번 집합 을 list로 풀었는데 BitMask를 사용하여 푸는 방법이 있었다.
옛날에 유니티때 마스크레이어 에 활용한 BitMask를 생각하며 정리하기.
댓글남기기