[STL] Bitset 생성 및 초기화 사용법
Notepad96
·2020. 11. 10. 10:17
300x250
1. bitset
bitset은 0 또는 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. 참 조
300x250
'C++ > Container' 카테고리의 다른 글
[STL] Priority_queue 생성, 삽입, 삭제 등 사용법 (0) | 2020.11.09 |
---|---|
[STL] Queue 생성, 삽입, 삭제 등 사용법 (0) | 2020.11.09 |
[STL] Stack 생성, 삽입, 삭제 등 사용법 (0) | 2020.11.08 |
[STL] Unordered_map, multimap 생성, 삽입, 삭제 등 사용법 (0) | 2020.11.08 |
[STL] Unordered_set, multiset 생성, 삽입, 삭제 등 사용법 (1) | 2020.11.07 |