bitset은 0또는 1, true 또는 false의 값을 갖도록 필요한 경우 사용할 수 있다.
이와 같은 형태의 따라서 여러가지 비트 연산을 할 수 있도록 여러 멤버 함수들을 지원한다.
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main() {
/* bitset 생성 */
// bitset<6> bit; // 000000
// bitset<6> bit("110011"); // 문자열 "110011"로 초기화
// bitset<20> bit2(58); // 10진수 58로 초기화
/* 비트 수정 */
bitset<6> bit("110011");
//bit[5] = 0; // bit.reset(5); // 인수 생략 시 전체 0
//bit[3] = 1; // bit.set(3, 1); // 인수 생략 시 전체 1
//bit[1] = !bit[1]; // bit.flip(1); // 인수 생략 시 전체 반전
cout << bit << "\\n";
/* 2진수 문자열 10진수로 변환 */
int n = bit.to_ulong(); // type = unsigned long integer
// int n = bit.to_ullong(); // type = unsigned long long
cout << bit << "를 10진수로 변환 : " << n << "\\n";
/* 비트 검사 */
// 모든 비트가 1이면 true, 하나라도 0이 존재하면 false
if (bit.all()) cout << "모두 1이다\\n";
else cout << "모두 1이 아니다\\n";
// 1이 하나라도 존재하면 true, 그렇지 않으면 false
if (bit.any()) cout << "0이 아니다\\n";
else cout << "0이다\\n";
// 1이 하나라도 존재하면 false, 그렇지 않으면 true
if (bit.none()) cout << "0이다\\n";
else cout << "0이 아니다\\n";
/* 10진수 숫자 -> 2진수 문자열 */
int num = 62;
bitset<20> bit2(num);
string s = bit2.to_string();
if (bit.any()) {
s = s.substr(s.find('1'));
}
else {
s = "0";
}
cout << num << "를 2진수로 변환 : " << s << "\\n";
/* bitset 탐색 */
cout << bit2 << "\\n";
cout << "비트 중 1의 개수 : " << bit2.count() << "\\n"; // 비트 1의 개수
for (int i = 0; i < bit2.size(); i++) { // bitset 전체 길이
cout << bit2[i] << " "; // 뒤에서부터 접근한다.
}
cout << "\\n";
return 0;
}
bitset은 '<>' 안에 사이즈를 지정하며 인수로는 문자열을 사용하던가 숫자(10진수, 16진수)를 사용하거나 하여 생성할 수 있다.
default는 0으로 되어있다.
bitset은 [] 연산자를 통한 읽기/쓰기가 가능하다.
여기서 주의해야 할 점은 기존 배열이나 문자열과 다르게 맨 뒤를 0부터 시작하여 역순으로 접근한다는 것이다.
비트 수정은 '[]' 연산자를 이용하여 더욱 쉽게 할 수도 있다.
reset(2) : 2번을 0으로 변경 생략 시 전체 비트 0
set(2, 0 or 1) : 2번을 0 또는 1로 변경 생략 시 전체 비트 1
flip(2) : 2번을 반전(0이면 1로, 1이면 0으로) 생략 시 전체 비트 반전
all() : 비트셋에서 모든 비트가 1일 경우 true, 그렇지 않으면 false
any() : 비트셋에 비트가 1인 것이 하나라도 존재한다면 true 그렇지 않으면 false
none() : 비트셋에 비트가 1인 것이 하나라도 존재하지 않는다면 true 그렇지 않으면 false