비트마스킹 알고리즘

Yunes·2023년 10월 29일
0
post-thumbnail

비트마스킹 기법 정리

비트연산자

  • a & b - and 연산
  • a | b - or 연산
  • a ^ b - xor 연산 (둘이 다르면 1, 아니면 0)
  • ~a - not
  • a << b - a 를 b 비트만큼 왼쪽으로 시프트 a = 001 b = 2 => a << b => 100
  • a >> b - a 를 b 비트만큼 오른쪽으로 시프트

집합 표현

  • {A, B, C, D, E} => {A} = 10000

원소 추가

  • 현재 상태 cur 이 있을 때 p 번 원소 추가시 아래와 같은 코드는 p 번 left shift 를 한 뒤, or 연산을 하므로 내가 원하는 p 번째 자리를 1 로 바꿔서 원소를 추가하듯 동작할 수 있게 된다.
  • cur = cur | (1 << p)

원소 삭제

  • & 는 둘다 1이어야 1이므로 특정 p 번째 비트만 0으로 만들어 p 번째 비트만 0으로 전환시켜줄 수 있는 방식이다.
  • cur = cur & ~ (1 << p);

원소 토글

  • ^ 는 다르면 1, 같으면 0인데 p 번째만 1이니 원래 p 번째가 1 이었다면 0으로 0 이었다면 1로 토글될 수 있다.
  • cur = cur ^ ( 1 << p )

집합연산

  • a | b 합집합
  • a & b 교집합
  • a & ~b a 에서 b 를 뺀 차집합
  • a ^ b a 와 b 중 하나에만 포함된 원소들의 집합

left shift

  • 참고한 문제 에서는 전체 크기가 20으로 제한이 되어있다. 그럴 경우 left shift 는 최대치를 려해야 한다.
  • 아래와 같이 & 와 ~ 을 활용하면 overflow 를 무시할 수 있다.

right shift

  • right shift 의 경우 0보다 작아질 수 없다. 그래서 그냥 >> 만 사용해도 된다.

레퍼런스

백준 15787 기차가 어둠을 헤치고 은하수를
굳건하게 - 비트마스킹이란

profile
미래의 나를 만들어나가는 한 개발자의 블로그입니다.

0개의 댓글