[C++ STL] bitset으로 2진수 다루기
카테고리: STL
🔍 std::bitset
C++ STL에서 제공하는 비트 집합 컨테이너로, 고정된 크기의 비트 배열을 효율적으로 관리할 수 있게 해준다.
bitset이 정의된 헤더
#include <bitset>
기본 사용법
비트 단위의 연산과 조작을 쉽게 할 수 있도록 다양한 멤버 함수를 제공한다.
// 크기가 8인 bitset 생성
std::bitset<8> bits;  // 기본값 00000000
// 정수로 초기화
std::bitset<8> bits1(42);  // 00101010
// 문자열로 초기화
std::bitset<8> bits2("11001100");
// 비트 연산
bits1 |= bits2;  // OR 연산
bits1 &= bits2;  // AND 연산
bits1 ^= bits2;  // XOR 연산
bits1.flip();    // 모든 비트 반전
주요 멤버 함수
- set(): 모든 비트를 1로 설정
- reset(): 모든 비트를 0으로 설정
- flip(): 모든 비트를 반전
- test(pos): 특정 위치의 비트 값 확인
- count(): 1로 설정된 비트의 개수 반환
- size(): bitset의 크기 반환
- to_string(): 비트열을 문자열로 변환
- to_ulong(): 비트열을 unsigned long으로 변환
- to_ullong(): 비트열을 unsigned long long으로 변환
예제
#include <bitset>
#include <iostream>
#include <string>
int main() {
    // 기본 사용
    std::bitset<8> bits("10101010");
    std::cout << "Original bits: " << bits << "\n";
    
    // 비트 조작
    bits.set(1);      // 특정 위치 1로 설정
    bits.reset(2);    // 특정 위치 0으로 설정
    bits.flip(3);     // 특정 위치 반전
    std::cout << "After manipulation: " << bits << "\n";
    
    // 비트 접근
    std::cout << "Bit at position 1: " << bits.test(1) << "\n";
    std::cout << "Number of set bits: " << bits.count() << "\n";
    
    // 문자열 변환
    std::string str = bits.to_string();
    std::cout << "As string: " << str << "\n";
    
    // 정수 변환
    unsigned long num = bits.to_ulong();
    std::cout << "As number: " << num << "\n";
    
    // 비트 연산
    std::bitset<8> bits2("11110000");
    std::cout << "AND: " << (bits & bits2) << "\n";
    std::cout << "OR: " << (bits | bits2) << "\n";
    std::cout << "XOR: " << (bits ^ bits2) << "\n";
    
    return 0;
}
활용 팁
- 플래그 관리
    std::bitset<8> flags; flags.set(0); // 첫 번째 플래그 활성화 if(flags.test(0)) { // 플래그가 활성화된 경우의 처리 }
- 비트 마스킹
    std::bitset<8> mask("11110000"); std::bitset<8> data("10101010"); auto result = data & mask; // 상위 4비트만 유지
- 비트 카운팅
    std::bitset<32> bits(0xF0F0F0F0); int count = bits.count(); // 1의 개수 세기
- 문자열 변환
    std::bitset<8> bits("10101010"); std::string binary = bits.to_string(); unsigned long decimal = bits.to_ulong();
- 비트 시프트
    std::bitset<8> bits("11110000"); bits <<= 2; // 왼쪽으로 2비트 시프트 bits >>= 1; // 오른쪽으로 1비트 시프트
성능 최적화 팁
- 크기 선택
    - 필요한 최소 비트 수만큼만 크기 지정
- 8의 배수 크기가 메모리 정렬에 유리
 
- 연산 최적화
    - 비트 연산은 CPU 레벨에서 최적화됨
- 복잡한 조건문 대신 비트 연산 활용
 
- 메모리 사용
    - vector<bool>대신- bitset사용 시 메모리 효율적
- 정적 크기로 인한 스택 메모리 사용
 
- 형변환 주의
    - to_ulong()/- to_ullong()사용 시 크기 제한 확인
- 오버플로우 발생 가능성 체크
 
- 병렬 처리
    - 비트 연산은 본질적으로 병렬 처리에 적합
- SIMD 명령어로 자동 최적화될 수 있음