[C++] 비트마스킹

yeolife ㅣ 2023. 7. 7. 16:20

정의

비트마스킹이란 컴퓨터의 연산 방식인 이진수의 표현을 자료구조 사용하는 기법이다

  • 수행시간이 빠름
  • 메모리 사용량이 적음

 

비트마스킹 연산

설명 코드
1
비트를 왼쪽으로 n만큼 이동(2^n) (1 << n)
예시 // (1 << 0) == 1
비트를 4만큼 이동하면 10000
 
2
n번째 비트 켜기 num |= (1 << n)
예시 10001의 2번째 비트를 키면 10101
 
3
n번째 비트 끄기 num &= ~(1 << n)
예시 10111의 2번째 비트를 끄면 10011
 
4 n번째 비트가 켜져있으면 True, 아니면 False if(num & (1 << n))
예시 10101의 2번째 피트가 켜져 있으므로 True
 
5
n번째를 비트를 반전 (XOR) num ^= (1 << n)
예시 10101의 2번째를 반전하면 10001
 
6 n만큼 왼쪽 시프트 한 결과에
1을 빼면 하위 자리의(1 ~ n-1) 비트가 켜짐
num = (1 << n) - 1
예시 100000 - 1 = 011111
 
7 켜져 있는 비트 중에서 마지막 비트 추출 n & -n
예시 1011100의 마지막 비트를 추출하면 100
 
8 아래부터 꺼진 비트 켜기  n | (n+1)
예시 0100 -> 0101 -> 0111 -> 1111
 
9
아래부터 켜진 비트 끄기 n & (n-1)
예시 0111 -> 0110 -> 0100 -> 0000
   
10 가장 가까운 꺼져있는 비트의 순번 int idx = 0;
while((n >> idx) & 1)
idx++;
예시 100111의 가까운 꺼져있는 비트의 순번은 3
 
11 가장 가까이 켜져있는 비트의 순번
(= 가장 가까이 켜져 있는 비트 전의 0의 개수)
__builtin_ctz(n)
예시 100100의 가까운 켜져있는 비트의 순번 2
 
12 켜져있는 비트수 세기 __builtin_popcount(n)
예시 10111의 켜져 있는 비트 수는 4