비트 마스크란?
우선 비트(bit, binary digit)는 하나의 비트는 0이나 1의 값을 가질 수 있고, 각각은 참, 거짓 혹은 서로 배타적인 상태를 나타낸다. 즉, 이진수를 비트라고 하는데 이 때 비트 마스크는비트 연산을 통해 문제를 해결하는 것을 뜻한다.
비트 연산자
그렇다면 파이썬의 비트 연산자에 대해 먼저 알아보자. 그 종류는 아래와 같다.
- & (Binary AND) : bit 단위로 and연산을 합니다. (논리곱)
- | (Binary OR) : bit 단위로 or연산을 합니다. (논리합)
- ^ (Binary XOR) : bit 단위로 xor연산을 합니다. (xor:두 비트가 서로 다르면 참, 아니면 거짓) (ex: 1^0=참 / 1^1=거짓 / 0^0=거짓)
- ~ (Binary NOT) : bit 단위로 not연산을 합니다.(1의 보수)
- << (Binary left Shift) : bit 단위로 왼쪽으로 비트단위 밀기 연산을 합니다.
- >> (Binary right Shift) : bit 단위로 오른쪽으로 비트단위 밀기 연산을 합니다.
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
'Language > Python' 카테고리의 다른 글
| 아스키 코드(ascii code) 및 파이썬 아스키 코드 변환 함수 (0) | 2022.10.26 |
|---|---|
| [Python] inconsistent use of tabs and spaces in indentation 에러 (0) | 2022.09.21 |
| Python bisect.bisect_left()와 bisect.bisect_right (0) | 2022.09.10 |
| [python] 파이썬 리스트의 슬라이싱 (0) | 2022.09.05 |
| [Python]파이썬 자료형별 시간복잡도 정리 (0) | 2022.09.03 |