[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 명령어로 자동 최적화될 수 있음