개요

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