1. bitset
bitset은 고정 크기의 비트 집합을 저장하는 C++ 표준 라이브러리 클래스
즉, 0과 1로 이루어진 이진수 형태의 데이터를 다루기 쉽게 만들어줌
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<8> b1("10110011"); // 8비트 크기, 문자열로 초기화
cout << b1 << endl; // 출력: 10110011
}
이런 식으로!
bitset<8> → 8개의 비트를 가진 비트 집합을 만든다는 뜻.
10110011 → 맨 왼쪽이 가장 높은 자리수(MSB).
2. 선언 방법
(1) 기본 선언
bitset<4> a; // 0000 (기본값은 모두 0)
cout << a << endl; // 0000
(2) 정수로 초기화
bitset<4> b(5); // 5 = 0101 (2진수)
cout << b << endl; // 0101
(3) 문자열로 초기화
bitset<8> c("11001100");
cout << c << endl; // 11001100
3. 주요 메서드와 사용법
| 기능 | 코드 | 설명 |
| 비트 출력 | cout << b; | 비트를 그대로 출력 |
| [] 접근 | b[0] | 오른쪽 끝이 index 0 |
| count() | b.count() | 1의 개수 반환 |
| size() | b.size() | 전체 비트 개수 반환 |
| any() | b.any() | 하나라도 1이면 true |
| none() | b.none() | 모두 0이면 true |
| set() | b.set(i) | i번째 비트를 1로 |
| reset() | b.reset(i) | i번째 비트를 0으로 |
| flip() | b.flip(i) | i번째 비트를 0↔1 반전 |
example)
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<8> b("10110000");
cout << "초기 상태: " << b << endl; // 10110000
// 1. 특정 비트 확인
cout << "b[0]: " << b[0] << endl; // 가장 오른쪽 → 0
cout << "b[5]: " << b[5] << endl; // 5번째 → 1
// 2. 1의 개수
cout << "1의 개수: " << b.count() << endl; // 3
// 3. 비트 뒤집기
b.flip(0); // 0번째 비트 반전
cout << "flip(0): " << b << endl; // 10110001
// 4. 특정 비트를 1로 만들기
b.set(2);
cout << "set(2): " << b << endl; // 10110101
// 5. 특정 비트를 0으로 만들기
b.reset(5);
cout << "reset(5): " << b << endl; // 10010101
// 6. 전부 뒤집기
b.flip();
cout << "flip(): " << b << endl; // 01101010
}
4. 비트 연산자 사용
bitset은 비트 논리 연산자를 그대로 쓸 수 있음.
| & | AND 연산 |
| ` | ` |
| ^ | XOR 연산 |
| ~ | NOT 연산 |
| << | 왼쪽 시프트 |
| >> | 오른쪽 시프트 |
example)
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<4> a("1100");
bitset<4> b("1010");
cout << "a: " << a << ", b: " << b << endl;
cout << "AND (&): " << (a & b) << endl; // 1000
cout << "OR (|): " << (a | b) << endl; // 1110
cout << "XOR (^): " << (a ^ b) << endl; // 0110
cout << "NOT (~a): " << (~a) << endl; // 0011 (반전)
cout << "a << 1: " << (a << 1) << endl; // 1000
cout << "a >> 1: " << (a >> 1) << endl; // 0110
}
5. bitset과 정수 변환
bitset ↔ 정수 변환이 가능!
| to_ulong() | unsigned long으로 변환 |
| to_ullong() | unsigned long long으로 변환 |
| to_string() | 문자열로 변환 |
example)
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<8> b("00010110"); // 22
cout << "정수: " << b.to_ulong() << endl; // 22
unsigned long num = 45;
bitset<8> c(num);
cout << "bitset: " << c.to_string() << endl; // 00101101
}
*** 예시문제들을 조금 보면서 공부해보기
문제1: 어떤 숫자가 2진수로 몇 개의 1을 가지고 있는지 출력하기
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int num = 29; // 11101
bitset<8> b(num); // 8비트로 표현
cout << "이진수: " << b << endl;
cout << "1의 개수: " << b.count() << endl;
}
// 출력결과
// 이진수: 00011101
// 1의 개수: 4
문제2: 스위치 8개를 켜고 끄기
#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<8> switches; // 초기값: 00000000
// 3번 스위치 켜기
switches.set(3);
cout << "3번 스위치 켜기: " << switches << endl; // 00001000
// 5번 스위치 켜기
switches.set(5);
cout << "5번 스위치 켜기: " << switches << endl; // 00101000
// 3번 스위치 끄기
switches.reset(3);
cout << "3번 스위치 끄기: " << switches << endl; // 00100000
// 모든 스위치 뒤집기
switches.flip();
cout << "flip(): " << switches << endl; // 11011111
}
문제3: 5개의 비트 중에서 부분집합을 모두 출력해보기
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int N = 5;
for (int i = 0; i < (1 << N); i++) {
bitset<5> b(i);
cout << b << endl;
}
}
/*출력결과
00000
00001
00010
00011
00100
...
11111
*/
최종정리!
- bitset은 고정 크기 비트 집합을 쉽게 다루기 위한 자료형.
- 문자열, 정수로 초기화 가능.
- 주요 메서드
- set, reset, flip → 비트 변경
- count, any, none → 상태 확인
- to_ulong, to_string → 변환
- 비트 연산자 그대로 사용 가능.
- 코딩 테스트에서 자주 사용:
- 부분집합 표현 (bitmask)
- 스위치/상태 관리
- 효율적인 메모리 관리
- 예: N개의 요소 중 어떤 것을 선택했는지 표현 → bitset<N> 사용하면 편리!
'C++' 카테고리의 다른 글
| c++로 조합 구현하기 (0) | 2025.06.19 |
|---|---|
| 데이터 파싱 (0) | 2025.06.17 |
| 커스텀 변수 연산자 오버로딩 (0) | 2025.06.17 |
| 정렬용 비교 함수 객체 (0) | 2025.06.17 |
| 포인터 (나중에 다시 또 공부하기;) (1) | 2025.06.17 |