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

+ Recent posts