[알고리즘] 비트마스크 (Bitmask)

2024. 12. 24. 00:54·ALGORITHM
 

안녕하세요. 오늘은 정수의 이진수표현을 활용하여 문제를 해결하는 기법인 비트마스크에 대해 알아보겠습니다. 또한 기본적인 비트 연산자에 대해서도 설명해보려고 합니다.
비트마스크를 설명하기 전에 기본적인 비트 연산자에 대해 설명하도록 하겠습니다.

 

 

 

 

 

비트 연산자 (&, |, ^, <<, >>)

1. and 연산자 ( & )

두 수를 이진수로 표현한 뒤, and 연산을 수행합니다.

           101     (5)
           110     (6)
and  ----------
           100     (4)

2. or 연산자 ( | )

두 수를 이진수로 표현한 뒤, or 연산을 수행합니다.

           101     (5)
           011     (3)
or   ----------
           111     (7)

3. xor 연산자 ( ^ )

두 수를 이진수로 표현한 뒤, xor 연산을 수행합니다.

두 비트가 같은 값이라면 0이 되고, 다른 값이라면 1이 됩니다. 1 ^ 1 의 결과는 0인 것이 헷갈릴 수 있으니 유의해야 합니다!

a b a ^ b
0 0 0
1 0 1
0 1 1
1 1 0
           101     (5)
           011     (3)
xor  ----------
           110     (6)

4. left shift 연산자 ( << )

두 수를 이진수로 표현한 뒤, left shift 연산을 수행합니다.

5      = 0000101   (5)
5 << 1 = 0001010   (10)
5 << 2 = 0010100   (20)
5 << 3 = 0101000   (40)

5. right shift 연산자 ( >> )

두 수를 이진수로 표현한 뒤, right shift 연산을 수행합니다.

13      = 0001101   (13)
13 >> 1 = 0000110   (6)
13 >> 2 = 0000011   (3)
13 >> 3 = 0000001   (1)

비트마스크란 ?

정수를 이진수로 표현하여 각 비트의 상태를 활용해 데이터를 효율적으로 저장하고 연산하는 기법입니다.

예를 들어, 0~31의 수의 존재 여부를 표현해야하는 문제에 적합합니다. 이는 해당 자리의 비트를 0 또는 1로 나타내어 해결할 수 있기 때문입니다. 비트마스크를 이용해 할 수 있는 연산에는 크게 4가지가 있습니다. 수의 존재여부 확인, 추가, 삭제, 모든 수를 한번에 채우기 가 가능합니다.

 

수의 존재 여부 확인 - (s>>x)&1

x가 존재하는지 확인하려면, x번째 비트가(Zero-Based-Indexing) 1인지 확인하면 됩니다.

예를 들어, 4가 존재하는지 확인하는 과정으로 설명하겠습니다.

우선 4번째 비트가 제일 끝에 올 수 있도록 비트를 오른쪽으로 4칸 미룹니다.

그리고 마지막 비트가 1인지 0인지 확인힙니다. 이는 1과 and 연산을 통해 구할 수 있습니다.(1 = 0000001)

<4번째 비트가 1인지 판단하는 경우>
s              00000000000000000000000000100011 (35)
s >> 2         00000000000000000000000000001000 (8)
1              00000000000000000000000000000001 (1)
(s >> x) & 1   00000000000000000000000000000000 (0)

 

 

 

 

'ALGORITHM' 카테고리의 다른 글

구간 칠하기  (0) 2025.04.17
십진수를 2진수로, n진수를 m 진수로 - 진수 변환 [알고리즘/JAVA]  (1) 2025.04.11
날짜와 시간 계산 - 시뮬레이션 [알고리즘]  (1) 2025.04.10
[Algorithm] 이분탐색 알고리즘 - Upper Bound/Lower Bound  (0) 2024.12.08
[JAVA] Arrays.sort 와 Collections.sort의 차이  (1) 2024.12.04
'ALGORITHM' 카테고리의 다른 글
  • 십진수를 2진수로, n진수를 m 진수로 - 진수 변환 [알고리즘/JAVA]
  • 날짜와 시간 계산 - 시뮬레이션 [알고리즘]
  • [Algorithm] 이분탐색 알고리즘 - Upper Bound/Lower Bound
  • [JAVA] Arrays.sort 와 Collections.sort의 차이
hyeblee
hyeblee
감자감자
  • hyeblee
    hyeblee
    hyeblee
  • 전체
    오늘
    어제
    • 분류 전체보기
      • PS
        • Programmers
        • BAEKJOON
        • CODETREE
      • ALGORITHM
      • JAVA
      • CS
        • 면접을 위한 CS전공지식
      • SPRING
      • 회고
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    플레이데이터 백엔드 부트캠프
    플레이데이터 백엔드
    arrays.sort #collections.sort #list.sort #객체정렬 #배열정렬 #timsort #dual pivot quicksort #정렬 #자바
    dfs
    하한값
    java #deque #자바 #덱
    날짜와 시간 계산
    16954
    구간 칠하기
    자바
    java #스프링부트 #자바버전 #자바 버전 충돌 #jvm
    백준
    왔다 갔던 구역2
    반닫힌 구간
    숨바꼭질3
    상한값
    BFS
    알고리즘
    spring #스프링 #스프링부트 #springboot #please sign in
    15652
    BOJ
    탐색
    플레이데이터 백엔드 부트캠프 후기
    흐른 시간 계산
    java
    backjoon
    spring #springboot #스프링 #스프링부트
    플레이데이터 백엔드 후기
    흐른 일수 계산
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeblee
[알고리즘] 비트마스크 (Bitmask)
상단으로

티스토리툴바