Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ bitset의 흥미로운 사실 3가지

C++ 표준 템플릿 라이브러리(STL)에는 bitset이라는 독특한 컨테이너가 정의되어 있습니다. bitset은 이름 그대로 데이터를 비트(bit) 단위로 다루기 위한 컨테이너로, 변수를 구성하는 개별 비트, 즉 주어진 값의 이진수 표현을 직접 조작하고 관리할 때 매우 유용합니다.

1. bitset은 문자열처럼 다룰 수 있다

bitset은 오직 0과 1만 유효한 값으로 가지는 비트들의 집합입니다. 재미있는 점은 문자열과 비슷한 방식으로 특정 구간만 잘라내어 새로운 bitset을 만들 수 있다는 것입니다. 시작 인덱스와 원소 개수를 지정하면 해당 범위의 비트들을 추출해 새 bitset의 뒤쪽에 덧붙일 수 있습니다.

예를 들어 비트 문자열 "10010110"에서 인덱스 1부터 4개의 원소를 추출한다고 해 보겠습니다. 이때 선택되는 부분은 "0010"이며, 이 값이 새 bitset의 끝에 추가됩니다. 결과적으로 8비트 bitset의 값은 00000010이 됩니다.

예제

#include <bitset>
#include <string>
#include <iostream>
int main() {
    std::string bit_string = "10010110";
    std::bitset<8> b1(bit_string, 1, 4);
    std::cout << b1 << '\n';
    return 0;
}

실행 결과

00000010

2. 문자열로부터 bitset 생성하기

bitset 생성자는 0과 1 외의 문자로 이루어진 문자열도 처리할 수 있습니다. 두 종류의 문자로만 구성된 문자열이라면, 각 문자를 0 또는 1에 대응시켜 그대로 bitset으로 변환하는 것이 가능합니다.

예를 들어 문자열 "xyxxyyyx"가 있다면, x는 0으로 y는 1로 대응하는 규칙을 적용해 길이가 동일한 bitset 01001110을 만들 수 있습니다.

이 작업을 위해 라이브러리에서는 다음과 같은 형태의 생성자를 제공합니다.

bitset(str, offSet, size, zeroVal, oneVal);

각 매개변수가 의미하는 바를 하나씩 살펴보겠습니다.

  • str – bitset을 만들 때 참조할 문자열입니다.
  • offSet – 문자열 내에서 읽기를 시작할 인덱스 위치입니다.
  • size – 생성할 bitset의 크기입니다.
  • zeroVal – 문자열에서 0으로 취급할 문자입니다.
  • oneVal – 문자열에서 1로 취급할 문자입니다.

예제

#include <bitset>
#include <string>
#include <iostream>
using namespace std;
int main() {
    string bitstr = "xyxxyyyx";
    bitset<8> bits(bitstr, 0, bitstr.size(), 'x', 'y');
    cout << "The bitset is : " << bits << '\n';
}

실행 결과

The bitset is: 01001110

3. bitset을 문자열로 변환하기

bitset에는 이를 다시 문자열로 되돌리는 to_string() 함수가 마련되어 있습니다. 이 함수는 bitset의 값을 문자열에 저장하며, 생성된 문자열의 길이는 bitset의 길이와 동일합니다.

요소가 저장되는 순서 역시 bitset의 순서와 같습니다. 즉, bitset의 첫 번째 요소가 문자열의 첫 번째 문자에 대응됩니다. 예를 들어 bitset 01010100을 문자열로 변환하면 "01010100"이 됩니다.

흥미로운 점은 매개변수를 지정해 0과 1을 임의의 문자로 치환할 수도 있다는 것입니다. 앞서 살펴본 "문자열 → bitset" 변환의 정확히 반대 과정이라고 생각하면 이해하기 쉽습니다.

예제

#include <iostream>
#include <bitset>
using namespace std;
int main() {
    bitset<8> b(19);
    cout << "The value of the bitset is : " << b << endl;
    cout << "The string conversion of the bitset is : " << b.to_string() << endl;
    cout << "The string conversion by replacing 0 with T and 1 with P is : ";
    cout << b.to_string('T', 'P') << endl;
}

실행 결과

The value of bitset is : 00010011
The string conversion of bitset is : 00010011
string conversion by replacing 0 with T and 1 with P is : TTTPTTPP

지금까지 살펴본 기능 외에도 bitset에는 다양한 연산과 비트 연산자들이 준비되어 있습니다. 여기서 소개한 내용들은 bitset의 기본적인 함수와 속성들이며, 이를 바탕으로 더 복잡한 비트 조작 로직도 손쉽게 구현할 수 있습니다.