비트 마스크(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를 사용하자