[TIL] 121 [C#] 비트연산자, 비트마스크 (BitMask)

업데이트:

카테고리:

태그: ,


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




예제

11723번 집합

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를 생각하며 정리하기.




📔

댓글남기기