C++

std::bitset<'비트크기'>

Keisa 2024. 8. 6. 14:37

std::bitset<256>은 C++ 표준 라이브러리에서 제공하는 템플릿 클래스인 std::bitset을 이용하여, 고정된 크기의 256개의 비트를 효율적으로 다룰 수 있게 해주는 자료형입니다. std::bitset은 비트 연산을 수행할 때 유용하며, 다음과 같은 특징과 사용법을 가지고 있습니다.

주요 특징

  1. 고정된 크기: std::bitset<256>은 256개의 비트를 저장할 수 있습니다. 크기는 컴파일 타임에 고정되므로, 런타임에 크기를 변경할 수 없습니다.
  2. 비트 연산 지원: 논리적 비트 연산(AND, OR, XOR), 비트 시프트 연산, 비트 반전 등의 다양한 비트 연산을 지원합니다.
  3. 비트 접근 및 조작: 특정 비트의 값을 설정, 해제, 토글할 수 있으며, 비트의 개별 값을 쉽게 접근할 수 있습니다.
  4. 입출력 지원: 비트를 문자열로 변환하거나 문자열로부터 비트를 설정할 수 있습니다. 또한 <<, >> 연산자를 통해 쉽게 입출력할 수 있습니다.

사용 예제

다음은 std::bitset<256>을 사용하는 간단한 예제 코드입니다.

#include <iostream>
#include <bitset>

int main() {
    // 256개의 비트를 가지는 bitset 선언
    std::bitset<256> bitset1;

    // 비트 설정
    bitset1.set(0);  // 0번째 비트를 1로 설정
    bitset1.set(5);  // 5번째 비트를 1로 설정

    // 비트 해제
    bitset1.reset(0);  // 0번째 비트를 0으로 설정

    // 비트 토글
    bitset1.flip(5);  // 5번째 비트를 반전

    // 비트 접근
    bool bitValue = bitset1.test(5);  // 5번째 비트의 값을 가져옴

    // 비트 출력
    std::cout << "Bitset: " << bitset1 << std::endl;

    // 비트 문자열 초기화
    std::bitset<256> bitset2("1100");  // 문자열을 이용해 bitset 초기화 (뒤에서부터 채워짐)

    // 비트 연산
    std::bitset<256> bitset3 = bitset1 & bitset2;  // AND 연산
    std::bitset<256> bitset4 = bitset1 | bitset2;  // OR 연산

    std::cout << "Bitset3 (AND): " << bitset3 << std::endl;
    std::cout << "Bitset4 (OR): " << bitset4 << std::endl;

    return 0;
}

 

주요 함수 및 연산자

  • set(): 모든 비트 또는 특정 비트를 1로 설정합니다.
  • reset(): 모든 비트 또는 특정 비트를 0으로 설정합니다.
  • flip(): 모든 비트 또는 특정 비트를 반전시킵니다.
  • test(): 특정 비트의 값을 반환합니다.
  • all(), any(), none(): 비트셋의 모든 비트가 1인지, 하나 이상의 비트가 1인지, 모든 비트가 0인지를 검사합니다.
  • count(): 1로 설정된 비트의 개수를 반환합니다.
  • size(): 비트셋의 크기를 반환합니다.
  • to_string(): 비트셋을 문자열로 변환합니다.
  • operator&, operator|, operator^: 비트 AND, OR, XOR 연산을 수행합니다.
  • operator<<, operator>>: 비트 시프트 연산을 수행합니다.

std::bitset<256>은 이러한 기능을 통해 효율적으로 비트를 관리하고 조작할 수 있는 강력한 도구를 제공합니다.

 

사용 예제

std::bitset<256> bsFlags;
for(int i = 0; i < 20; i++)
{
    if(bsFlags[i])
    {
        int a = 0;
    }
}

 

코드 설명

  1. std::bitset<256> bsFlags;: 256개의 비트를 가지는 bitset 객체를 선언합니다.
  2. for(int i = 0; i < 20; i++): 0부터 19까지, 총 20번 반복합니다.
  3. if(bsFlags[i]): bsFlags의 i번째 비트가 1인지 확인합니다.
    • bsFlags[i]는 bsFlags 객체의 i번째 비트를 반환합니다. bitset 클래스는 배열처럼 인덱스를 통해 각 비트에 접근할 수 있게 오버로딩되어 있습니다.
  4. 만약 bsFlags[i]가 true(즉, 1)라면, { int a = 0; } 블록이 실행됩니다.

비트 접근

  • bsFlags[i]를 통해 bitset의 i번째 비트에 접근합니다. 이때 i는 0부터 시작하여 19까지 증가합니다.
  • bitset 클래스는 각 비트를 인덱스로 접근할 수 있게 하여, 특정 비트가 1인지 0인지 쉽게 확인할 수 있습니다.

따라서, for문 안에서 bsFlags[i]를 사용하여 bitset의 비트를 하나씩 접근하고, 해당 비트가 1인지 확인하는 것이 맞습니다. 이 코드는 bsFlags의 첫 20개의 비트를 검사하여, 각 비트가 1인지 여부를 확인합니다.

 

사용 예제

비트 접근 및 제어 예제

#include <iostream>
#include <bitset>

int main() {
    std::bitset<256> bsFlags;  // 256개의 비트를 가지는 bitset 객체 생성

    // 비트 설정
    bsFlags.set(3);  // 3번째 비트를 1로 설정
    bsFlags.set(5);  // 5번째 비트를 1로 설정
    bsFlags.set(7);  // 7번째 비트를 1로 설정

    // 비트 해제
    bsFlags.reset(3);  // 3번째 비트를 0으로 설정

    // 비트 토글
    bsFlags.flip(5);  // 5번째 비트를 반전 (1 -> 0)

    // 특정 비트 확인
    if (bsFlags.test(7)) {  // 7번째 비트가 1인지 확인
        std::cout << "7번째 비트는 1입니다." << std::endl;
    } else {
        std::cout << "7번째 비트는 0입니다." << std::endl;
    }

    // 모든 비트 확인 (예제에서 첫 20개만 확인)
    for (int i = 0; i < 20; ++i) {
        std::cout << "비트 " << i << ": " << bsFlags[i] << std::endl;
    }

    return 0;
}

 

주요 함수 및 연산자

  • set(size_t pos): pos 위치의 비트를 1로 설정합니다.
  • reset(size_t pos): pos 위치의 비트를 0으로 설정합니다.
  • flip(size_t pos): pos 위치의 비트를 반전시킵니다.
  • test(size_t pos): pos 위치의 비트가 1인지 확인합니다.
  • operator[]: 인덱스를 통해 비트에 접근할 수 있게 해줍니다.

요약

위 예제에서 보듯이 std::bitset을 사용하면 비트 단위로 접근하고 제어할 수 있습니다. 이를 통해 매우 효율적으로 메모리를 사용하면서도 필요한 비트 연산을 쉽게 수행할 수 있습니다. bsFlags[i]는 i번째 비트에 접근하는 방법으로, 각 비트를 개별적으로 확인하고 설정할 수 있습니다.

 

 

'C++' 카테고리의 다른 글

const 변수에 대한 최적화  (0) 2024.12.17
const 변수와 일반 변수  (0) 2024.12.17
템플릿의 정의를 CPP에 쓸 수 없는 이유  (0) 2024.07.25
__declspec(dllexport)  (0) 2024.06.20
extern "C"  (0) 2024.06.20