비트마스킹(Bit Masking)은 비트 단위로 데이터를 조작하는 기법으로, 주로 특정 비트를 설정, 해제, 반전하거나 특정 비트의 값을 추출하는 데 사용됩니다. 비트마스킹은 주로 성능이 중요한 상황에서 메모리 사용을 최적화하고, 여러 개의 불리언 값을 하나의 정수형 변수에 저장할 수 있게 해줍니다.
비트마스킹의 기본 연산은 다음과 같습니다:
AND 연산 (&): 특정 비트를 유지하고 나머지 비트를 0으로 설정합니다.
OR 연산 (|): 특정 비트를 1로 설정하고 나머지 비트는 그대로 유지합니다.
XOR 연산 (^): 특정 비트를 반전시킵니다.
NOT 연산 (~): 모든 비트를 반전시킵니다.
왼쪽 시프트 (<<): 비트를 왼쪽으로 이동시켜 2의 거듭제곱을 곱합니다.
오른쪽 시프트 (>>): 비트를 오른쪽으로 이동시켜 2의 거듭제곱으로 나눕니다.
C++ 예시
아래는 C++에서 비트마스킹을 사용하는 간단한 예시입니다. 이 예시에서는 비트를 설정하고, 해제하고, 확인하는 방법을 보여줍니다.
#include <iostream>
class BitMask {
public:
BitMask() : mask(0) {}
// 특정 비트를 설정
void setBit(int position) {
mask |= (1 << position);
}
// 특정 비트를 해제
void clearBit(int position) {
mask &= ~(1 << position);
}
// 특정 비트가 설정되어 있는지 확인
bool isBitSet(int position) {
return (mask & (1 << position)) != 0;
}
// 현재 비트 마스크 출력
void printMask() {
std::cout << "Current Bit Mask: " << mask << std::endl;
}
private:
int mask; // 비트 마스크를 저장할 변수
};
int main() {
BitMask bm;
bm.setBit(1); // 2의 1승 비트 설정
bm.setBit(3); // 2의 3승 비트 설정
bm.printMask(); // 출력: Current Bit Mask: 10 (2진수로 1010)
std::cout << "Is bit 1 set? " << bm.isBitSet(1) << std::endl; // 출력: 1 (true)
std::cout << "Is bit 2 set? " << bm.isBitSet(2) << std::endl; // 출력: 0 (false)
bm.clearBit(1); // 2의 1승 비트 해제
bm.printMask(); // 출력: Current Bit Mask: 8 (2진수로 1000)
return 0;
}