[C++ STL] bitset으로 2진수 다루기

Date:     Updated:

카테고리:

태그:

🔍 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;
}

활용 팁

  1. 플래그 관리
    std::bitset<8> flags;
    flags.set(0);  // 첫 번째 플래그 활성화
    if(flags.test(0)) {
        // 플래그가 활성화된 경우의 처리
    }
    
  2. 비트 마스킹
    std::bitset<8> mask("11110000");
    std::bitset<8> data("10101010");
    auto result = data & mask;  // 상위 4비트만 유지
    
  3. 비트 카운팅
    std::bitset<32> bits(0xF0F0F0F0);
    int count = bits.count();  // 1의 개수 세기
    
  4. 문자열 변환
    std::bitset<8> bits("10101010");
    std::string binary = bits.to_string();
    unsigned long decimal = bits.to_ulong();
    
  5. 비트 시프트
    std::bitset<8> bits("11110000");
    bits <<= 2;  // 왼쪽으로 2비트 시프트
    bits >>= 1;  // 오른쪽으로 1비트 시프트
    

성능 최적화 팁

  1. 크기 선택
    • 필요한 최소 비트 수만큼만 크기 지정
    • 8의 배수 크기가 메모리 정렬에 유리
  2. 연산 최적화
    • 비트 연산은 CPU 레벨에서 최적화됨
    • 복잡한 조건문 대신 비트 연산 활용
  3. 메모리 사용
    • vector<bool> 대신 bitset 사용 시 메모리 효율적
    • 정적 크기로 인한 스택 메모리 사용
  4. 형변환 주의
    • to_ulong()/to_ullong() 사용 시 크기 제한 확인
    • 오버플로우 발생 가능성 체크
  5. 병렬 처리
    • 비트 연산은 본질적으로 병렬 처리에 적합
    • SIMD 명령어로 자동 최적화될 수 있음

STL 카테고리 내 다른 글 보러가기