알고리즘 문제해결전략/비트마스크

[개념정리]C++ 비트마스크(bitmask)란?

student513 2020. 5. 1. 14:48

비트 마스크(bitmask) : 이진수 표현을 자료구조로 쓰는 기법

 

비트 연산자

  • AND 
  • OR, XOR
  • NOT
  • shift : 이진수 a의 비트를 오른쪽, 왼쪽으로 원하는 만큼 움직임.
    • a << b (정수 a를 왼쪽으로 b비트 시프트) : 비트가 왼쪽으로 밀리고, 오른쪽은 0으로 채워진다.                  ex) 2bit shift : 1111 0010 ->1111 0010 00
    • a >> b (정수 a를 오른쪽으로 b비트 시프트) : 비트가 오른쪽으로 밀리고, 왼쪽 끝부터 0으로 채워진다.        ex) 10 1111 0010 -> 1011 1100

주의점 

* 비트 연산자 우선순위는 비교 연산자보다 낮다. 4==4부터 계산되어버림

int c = (6 & 4 == 4);

* 오버플로우 이슈

bool isBitSet(unsigned long long a, int b) { 
	return (a & (1 << b)) > 0;
}

1은 32bit signed 상수여서 b >=32 라면 1은 왼쪽으로 b비트만큼 시프트하여 오버플로우가 발생할 수 있다.

문제를 해결하기 위해선 1뒤에 ull을 붙여 unsigned 64bit 정수임을 명시해야한다.

 

*MSB(Most Significant Bit)

signed int의 경우 가장 앞자리 bit는 음수 양수를 표시하는 기능을 하므로, 시프트 연산과정에서 버그 발생가능성이 있다. 변수의 모든 bit를 사용하고 싶다면 unsigned int를 사용하자