std::bitset<256>은 C++ 표준 라이브러리에서 제공하는 템플릿 클래스인 std::bitset을 이용하여, 고정된 크기의 256개의 비트를 효율적으로 다룰 수 있게 해주는 자료형입니다. std::bitset은 비트 연산을 수행할 때 유용하며, 다음과 같은 특징과 사용법을 가지고 있습니다.
주요 특징
- 고정된 크기: std::bitset<256>은 256개의 비트를 저장할 수 있습니다. 크기는 컴파일 타임에 고정되므로, 런타임에 크기를 변경할 수 없습니다.
- 비트 연산 지원: 논리적 비트 연산(AND, OR, XOR), 비트 시프트 연산, 비트 반전 등의 다양한 비트 연산을 지원합니다.
- 비트 접근 및 조작: 특정 비트의 값을 설정, 해제, 토글할 수 있으며, 비트의 개별 값을 쉽게 접근할 수 있습니다.
- 입출력 지원: 비트를 문자열로 변환하거나 문자열로부터 비트를 설정할 수 있습니다. 또한 <<, >> 연산자를 통해 쉽게 입출력할 수 있습니다.
사용 예제
다음은 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;
}
}
코드 설명
- std::bitset<256> bsFlags;: 256개의 비트를 가지는 bitset 객체를 선언합니다.
- for(int i = 0; i < 20; i++): 0부터 19까지, 총 20번 반복합니다.
- if(bsFlags[i]): bsFlags의 i번째 비트가 1인지 확인합니다.
- bsFlags[i]는 bsFlags 객체의 i번째 비트를 반환합니다. bitset 클래스는 배열처럼 인덱스를 통해 각 비트에 접근할 수 있게 오버로딩되어 있습니다.
- 만약 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 |