본문 바로가기
Algorithm/이론

비트연산 활용

by Salgoo26 2021. 9. 29.

비트연산 정리

& 연산자

  1. 특정 비트를 0으로 만들 수 있음
  2. 특정 비트가 0인지 1인지 검사하는 용도 (ex. 홀, 짝 확인)
  0101
& 0000
-------
  0000
# 홀짝 확인
a = 2
b = 3

print(a & 1)
print(b & 1)

>> 0
>> 1

| 연산자

  1. 특정 비트를 1로 만드는 데에 활용될 수 있음
  0101
& 1111
-------
  1111

XOR 연산자

  1. 비트 단위로 비교하는 연산 (같으면 0, 다르면 1)
  2. 비트 토글(특정 비트를 반전하는 역할)
  0101
& 1111
-------
  1010
# XOR - 반전
# a배열에서 b의 원소를 인덱스 0->1, 1->0 으로 바꾸기
a = [1, 0, 0, 1, 1, 0, 0, 0]
b = [0, 1, 2, 7]

for i in b:
    #a[i] ^= 1
    a[i] = a[i]^1


# XOR - 비교
a = 113
b = 25
c = 25

print(a^b)  # 다르면 0이 아니고,
print(b^c)  # 같으면 0

shift 연산자 (<<, >>)

  1. *2 or //2
  2. 1<<n : 2^n 의 값을 갖는다
  3. 1<<n은 원소가 n개일 경우의 모든 부분집합의 수 의미

i & (1<<j)
i의 j번째 비트가 1인지 아닌지 확인

for i in range(1<<3):
    if i & (1<<2):  # 0이 아니면
        print(f'{i}의 2번 비트는 1')
    else:
        print(f'{i}의 2번 비트는 0')


# 다음과 같이 비트연산을 활용할 수도 있음
for i in range(1<<3):
    print(f'{i}의 2번 비트는 {(i&(1<<2))>>2}')

'Algorithm > 이론' 카테고리의 다른 글

Merge sort  (0) 2021.10.09
그리디  (0) 2021.09.30
최대공약수 구하기 - 유클리드 호제법  (0) 2021.09.21
DP(다이나믹 프로그래밍)  (0) 2021.09.07
검색 알고리즘  (0) 2021.08.23

댓글