본문 바로가기
Language/Python

Python 비트 마스크(Bit Mask)

by brother_stone 2022. 9. 26.

비트 마스크란?

우선 비트(bit, binary digit)는 하나의 비트는 0이나 1의 값을 가질 수 있고, 각각은 참, 거짓 혹은 서로 배타적인 상태를 나타낸다. 즉, 이진수를 비트라고 하는데 이 때 비트 마스크는비트 연산을 통해 문제를 해결하는 것을 뜻한다.

 

비트 연산자

그렇다면 파이썬의 비트 연산자에 대해 먼저 알아보자. 그 종류는 아래와 같다.

  1. & (Binary AND) : bit 단위로 and연산을 합니다. (논리곱)
  2. | (Binary OR) : bit 단위로 or연산을 합니다. (논리합)
  3. ^ (Binary XOR) : bit 단위로 xor연산을 합니다. (xor:두 비트가 서로 다르면 참, 아니면 거짓) (ex: 1^0=참 / 1^1=거짓 / 0^0=거짓)
  4. ~ (Binary NOT) : bit 단위로 not연산을 합니다.(1의 보수)
  5. << (Binary left Shift) : bit 단위로 왼쪽으로 비트단위 밀기 연산을 합니다.
  6. >> (Binary right Shift) : bit 단위로 오른쪽으로 비트단위 밀기 연산을 합니다.

출처:https://wikidocs.net/20704

 

1. & (AND 연산자)

bin(0b10101 & 0b01100)	# 0b100

 

2. | (OR 연산자)

bin(0b10101 | 0b01100)	# 0b11101

 

3. ^ (XOR 연산자)

bin(0b10101 ^ 0b01100)	# 0b11001

 

4. ~ (NOT 연산자)

~0b1100 = 0b0011 = 0b11

 

5. << (LEFT SHIFT 연산자)

bin(0b10101 << 1)	# 0b101010

 

6. >> (RIGHT SHIFT 연산자)

bin(0b10101 >> 1)	# 0b1010

 

 

비트 연산 응용

원소 추가

n번째 수를 추가하려고 할 때

n = 3
#기존의 이진수 0b0010와 1을 왼쪽으로 3만큼 비트단위 밀기 연산의 결과값 0b1000를 논리합해서 만든다.
print(bin(0b0010 | (1 << n)))  #  0b0010 | 0b1000 = 0b1010

 

원소 제거

n번째 수를 제거하려고 할 때

n = 3
#기존의 이진수 0b0010와 1을 왼쪽으로 3만큼 비트단위 밀기 연산의 not연산 결과값 0b0111를 논리곱해서 만든다.
print(bin(0b1010 & ~(1 << n)))  #  0b0010 = 0b10

 

원소 조회

n번째 수가 있나 없나 확인 할 때 (0이면 없고, 1 이상이면 있는 것)

n = 3
#조회하고자하는 이진수와 왼쪽으로 3만큼 비트 밀기한 결과값을 논리곱하여 구한다.
print(bin(0b1010 & (1 << n)))  #  0b1000

 

원소 토글

n번째 수가 켜져있으면(참이면) 끄고 꺼져있으면(거짓이면) 켠다

n = 3
#기존의 이진수와 왼쪽으로 3만큼 비트 밀기한 결과값을 배타적 논리합하여 구한다.
print(bin(0b1010 ^ (1 << n)))  #  0b1010 ^ 0b1000 = 0b10

 

출처:https://justkode.kr/algorithm/bitmash