이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Algorithm] 비트마스킹(bitmasking)

  • 2023.02.10 10:37
  • Algorithm/Algorithm
글 작성자: SeoArc

비트마스킹?

컴퓨터는 내부적으로 모든 자료를 이진수로 표현한다.

이와 같은 특성을 이용해 정수의 이진수 표현을 자료구조로 쓰는 기법을 비트 마스크라고 한다.

비트 마스크를 이용하면 더 빠른 수행시간, 간결한 코드, 적은 메모리 사용의 효과를 얻을 수 있다.

 

비트 연산자

  • a & b: AND 연산
  • a | b: OR 연산
  • a ^ b: XOR 연산
  • ~a: NOT 연산
  • a << b: a를 b비트 만큼 왼쪽으로 시프트
  • a >> b: a를 b비트 만큼 오른쪽으로 시프트

 

집합 표현

비트마스크를 이용하면 집합을 쉽게 표현할 수 있다.

 

원소 추가

현재 상태 cur이 있을 때, p번째에 원소를 추가한다고 하면 다음과 같다

cur = cur | (1 << p)

 

원소 삭제

현재 상태 cur이 있을 때, p번째에 원소를 삭제한다고 하면 다음과 같다

cur = cur & ~(1 << p);

 

원소 토글

현재 상태 cur이 있을 때, p번째에 원소 상태를 변경한다고 하면 다음과 같다

cur = cur ^ (1 << p);

 

집합 연산

a | b // 합집합
a & b // 교집합
a & ~b // a - b 차집합
a ^ b // a와 b중 하나에만 포함된 원소들의 집합

 

집합의 크기 구하기

집합의 크기를 구하려면, 현재 1로 켜져있는 비트의 수를 count 해야한다. 따라서 모든 비트를 순회해야 하고 재귀적으로 다음과 같이 구현할 수 있다.

int bitCount(int x) {
  if (x == 0) {
    return 0;
  }
  return x % 2 + bitCount(x / 2);
}

 

모든 부분집합 순회하기

어떤 집합의 모든 부분 집합을 순회하는 과정도 정말 간단하게 구현할 수 있다.

for (int subset = set; subset >= 0; subset = (subset - 1) & set) {
  // subset은 set의 부분집합 중 하나.
}

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

[Algorithm] 프림 알고리즘(Prim's algorithm)  (0) 2023.02.28
[Algorithm] 다익스트라(Dijkstra)  (0) 2023.02.26
[Algorithm] 크루스칼 알고리즘 (Kruskal Algorithm)  (0) 2023.02.19
[Algorithm] 유니온-파인드(Union-Find)  (0) 2023.02.19
[Algorithm] 백트래킹(BackTracking)  (0) 2023.02.14

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Algorithm] 다익스트라(Dijkstra)

    [Algorithm] 다익스트라(Dijkstra)

    2023.02.26
  • [Algorithm] 크루스칼 알고리즘 (Kruskal Algorithm)

    [Algorithm] 크루스칼 알고리즘 (Kruskal Algorithm)

    2023.02.19
  • [Algorithm] 유니온-파인드(Union-Find)

    [Algorithm] 유니온-파인드(Union-Find)

    2023.02.19
  • [Algorithm] 백트래킹(BackTracking)

    [Algorithm] 백트래킹(BackTracking)

    2023.02.14
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (109)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (5)
      • Spring (3)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (1)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • algorithm
  • 자바
  • java
  • graph
  • 네트워크
  • network
  • 알고리즘
  • 그래프

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바