[STL] Bitset 생성 및 초기화 사용법

Notepad96

·

2020. 11. 10. 10:17

300x250

 

 

1. bitset

 

bitset0 또는 1, true 또는 false의 값을 갖도록 필요한 경우 사용할 수 있다.

 

이와 같은 형태의 따라서 여러가지 비트 연산을 할 수 있도록 여러 멤버 함수들을 지원한다.

 

 

 

 

또한, 마찬가지로 이러한 경우에 vector<bool>을 사용할 수도 있을 것이다.

 

하지만 이는 권장하지 않는 형태라는 등 여러가지 말이 많다.

 

 

 

 

그렇다면 어떠한 경우에 어떠한 것을 사용해야 하는가 하면

 

vector<bool> : 동적인 사이즈를 갖는 경우, 복잡한 비트 연산이 필요없는 경우

 

bitset<6> : 정적인 사이즈를 갖는 경우, 복잡한 비트 연산이 필요한 경우( 10진수 변환, 비트 반전 등)

 

라고 분류 할 수 있다.

 

 

 

 


2. 코 드

환경 : Visual studio 2019
 

 

#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진수)를 사용하거나 하여 생성할 수 있다.
 
defalut는 0으로 되어 있다.
 
 
 
 
- bitset은 '[]' 연산자를 사용하여서 접근하여 읽기, 쓰기를 할 수 있다.
 
여기서 주의해야 할 점은 기존 배열이나 문자열과 다르게 맨 뒤를 0부터 시작하여 역순으로 접근한다는 것이다.
 
 
결과의 마지막 출력부분을 보면 for 루프에서 맨 뒤부터 앞쪽으로 접근하는 것을 확인 할 수 있다.
 
 
 
 
 
- 비트 수정
 
비트 수정은 '[]' 연산자를 이용하여 더욱 쉽게 할 수도 있다.
 
 
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
 
 
 
 
 
- 비트 변환
 
to_string() : 비트셋을 문자열로 변환한다.
 
 
to_ulong() : 비트셋을 unsigned long integer 타입으로 변환한다.
 
 
to_ullong() : 비트셋을 unsigned long long 타입으로 변환한다.
 
 
 
 
 
- size() : bitset의 size를 반환한다.
 
 
- count() : 현재 bitset의 있는 비트 1의 개수를 반환한다.
 
 
 
 
 


3. 참 조

 
 

bitset - C++ Reference

 

www.cplusplus.com

 

300x250