utility_bitset

utility_bitset (비트셋 유틸리티)

이 페이지에서는 C++ 표준 라이브러리의 std::bitset 클래스 템플릿에 대해 설명해요. std::bitset은 고정된 크기의 비트 시퀀스를 표현하며, 표준 논리 연산자로 조작하거나 문자열·정수로 변환할 수 있어요. 컴파일 타임에 크기가 결정되는 비트 집합이 필요할 때 사용해요.

출처: cppreference

본문

<bitset> 헤더에 정의되어 있어요.

정의
template < std :: size_t N > class bitset ;

클래스 템플릿 bitset은 N비트로 이루어진 고정 크기 시퀀스를 나타내요. 비트셋은 표준 논리 연산자로 조작할 수 있고, 문자열 및 정수로 변환하거나 그 반대로 변환할 수 있어요. 문자열 표현과 시프트 연산의 방향을 정할 때, 시퀀스는 정수의 이진 표현처럼 가장 낮은 인덱스 요소가 오른쪽에 있는 것으로 간주해요.

bitsetCopyConstructibleCopyAssignable 요구 사항을 충족해요.

std::bitset의 모든 멤버 함수는 constexpr이에요. 상수 표현식 평가에서 std::bitset 객체를 생성하고 사용할 수 있어요. (C++23부터)

템플릿 매개변수

N - 저장 공간을 할당할 비트 수

멤버 타입

reference 비트에 대한 참조를 나타내는 프록시 클래스 (클래스)

멤버 함수

(생성자) bitset을 생성해요 (공개 멤버 함수) [edit]
operator== operator!= (C++20에서 제거됨) 내용을 비교해요 (공개 멤버 함수) [edit]
요소 접근
operator[] 특정 비트에 접근해요 (공개 멤버 함수) [edit]
test 특정 비트에 접근해요 (공개 멤버 함수) [edit]
all any none 모든 비트, 일부 비트, 또는 어떤 비트도 true인지 확인해요 (공개 멤버 함수) [edit]
count true로 설정된 비트 수를 반환해요 (공개 멤버 함수) [edit]
용량
size bitset이 보유한 비트 수를 반환해요 (공개 멤버 함수) [edit]
수정자
operator&= operator|= operator^= operator~ 이진 AND, OR, XOR, NOT 연산을 수행해요 (공개 멤버 함수) [edit]
operator<<= operator>>= operator<< operator>> 이진 왼쪽 및 오른쪽 시프트 연산을 수행해요 (공개 멤버 함수) [edit]
set 비트를 true 또는 주어진 값으로 설정해요 (공개 멤버 함수) [edit]
reset 비트를 false로 설정해요 (공개 멤버 함수) [edit]
flip 비트 값을 반전해요 (공개 멤버 함수) [edit]
변환
to_string 데이터의 문자열 표현을 반환해요 (공개 멤버 함수) [edit]
to_ulong 데이터의 unsigned long 정수 표현을 반환해요 (공개 멤버 함수) [edit]
to_ullong (C++11) 데이터의 unsigned long long 정수 표현을 반환해요 (공개 멤버 함수) [edit]

비멤버 함수

operator& operator| operator^ bitset에 대해 이진 논리 연산을 수행해요 (함수 템플릿) [edit]
operator<< operator>> bitset의 스트림 입력 및 출력을 수행해요 (함수 템플릿) [edit]

도우미 클래스

std::hash <std::bitset> (C++11) std::bitset에 대한 해시 지원 (클래스 템플릿 특수화) [edit]

참고 사항

비트셋의 크기를 컴파일 타임에 알 수 없거나, 런타임에 크기를 변경해야 한다면 std::vector<bool>이나 boost::dynamic_bitset<> 같은 동적 타입을 대신 사용할 수 있어요.

기능 테스트 매크로 표준 기능
__cpp_lib_constexpr_bitset 202207L (C++23) 더욱 constexpr한 std::bitset
__cpp_lib_bitset 202306L (C++26) std::bitsetstd::string_view 인터페이스

예제

#include <bitset>
#include <cassert>
#include <cstddef>
#include <iostream>

int main()
{
    typedef std::size_t length_t, position_t; // the hints

    // constructors:
    constexpr std::bitset<4> b1;
    constexpr std::bitset<4> b2{0xA}; // == 0B1010
    std::bitset<4> b3{"0011"}; // can also be constexpr since C++23
    std::bitset<8> b4{"ABBA", length_t(4), /*0:*/'A', /*1:*/'B'}; // == 0B0000'0110

    // bitsets can be printed out to a stream:
    std::cout << "b1:" << b1 << "; b2:" << b2 << "; b3:" << b3 << "; b4:" << b4 << '\n';

    // bitset supports bitwise operations:
    b3 |= 0b0100; assert(b3 == 0b0111);
    b3 &= 0b0011; assert(b3 == 0b0011);
    b3 ^= std::bitset<4>{0b1100}; assert(b3 == 0b1111);

    // operations on the whole set:
    b3.reset(); assert(b3 == 0);
    b3.set(); assert(b3 == 0b1111);
    assert(b3.all() && b3.any() && !b3.none());
    b3.flip(); assert(b3 == 0);

    // operations on individual bits:
    b3.set(position_t(1), true); assert(b3 == 0b0010);
    b3.set(position_t(1), false); assert(b3 == 0);
    b3.flip(position_t(2)); assert(b3 == 0b0100);
    b3.reset(position_t(2)); assert(b3 == 0);

    // subscript operator[] is supported:
    b3[2] = true; assert(true == b3[2]);

    // other operations:
    assert(b3.count() == 1);
    assert(b3.size() == 4);
    assert(b3.to_ullong() == 0b0100ULL);
    assert(b3.to_string() == "0100");
}

출력:

b1:0000; b2:1010; b3:0011; b4:00000110

같이 보기

vector <bool> 공간 효율적인 동적 비트셋 (클래스 템플릿 특수화) [edit]
비트 조작 (C++20) 개별 비트와 비트 시퀀스에 접근·조작·처리하는 유틸리티

더 알아보기 (Learn more)

cppreference