밑 예제 들은 Python
으로 작성 되었습니다.
거두절미 하고 이야기 하면, 비트마스크는 알고리즘 이라기 보단 테크닉에 가깝습니다. 비트는 컴퓨터에서 다루는 최소 단위이며, 정수를 이진수로 표현, 비트 연산을 통해 문제를 해결해 나가는 기술을 비트마스크 라고 합니다.
예를 들어 보겠습니다. 10개의 스위치가 있다고 가정하고, 우리는 이 10개의 스위치 상태를 표현 하고 싶습니다! 당연히 스위치는 on/off 만 존재 할 것입니다. 이를 list
형태로 표현하면.
switch_states = [True, False, False, True, True, False, False, False, True, True]
하지만, 이는 2진수의 숫자 로도 표현 할 수 있지 않을까요?
switch_states = 0b1001100011 # 611, python에서는 앞에 '0b'를 붙여 이진수 표현 가능
이렇게 정수형으로 나타내면 장점이 다양합니다.
대응하는 숫자가 모두 1일 경우 1을 반환합니다.
bin(0b1010011010 & 0b1101101100) # 0b1000001000
대응하는 숫자중 하나라도 1일 경우 1을 반환합니다.
bin(0b1010011010 | 0b1101101100) # 0b1111111110
대응하는 숫자가 서로 다를 경우 1을 반환합니다.
bin(0b1010011010 ^ 0b1101101100) # 0b111110110
a << b
는 a
의 비트를 b
칸 만큼 왼쪽으로 밀어 내는 것이고, a >> b
는 a
의 비트를 b
칸 만큼 오른쪽으로 밀어내는 것 입니다.
bin(0b0010 << 2) # 0b1000
bin(0b1100 >> 2) # 0b11
비트 값을 반전시킵니다.
bin(~0b0010 << 2) # 0b1101
n번째 수를 추가 하고자 할 때
n = 3
print(bin(0b0010 | (1 << n))) # 0b1010
n번째 수를 제거 하고자 할 때
n = 3
print(bin(0b1010 & ~(1 << n))) # 0b10
n번째 수가 있나 없나 확인 할 때 (0이면 없고, 1 이상이면 있는 것)
n = 3
print(bin(0b1010 & (1 << n))) # 0b1000
n번째 수를 켜져 있으면 끄고, 꺼져 있으면 켬
n = 3
print(bin(0b1010 ^ (1 << n))) # 0b10