본문 바로가기
프로그래밍 언어/C++

[C++] [STL] bitset

by 까망 하르방 2021. 8. 1.
반응형

bitset

비트연산과 관련된 STL 이다.

비트마스크 (Bitmask)

 

비트마스크 (Bitmask)

비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현 내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리

zoosso.tistory.com


- 헤더파일: #include <bitset>

- bitset은 [index]로 접근해서 연산자로 쓰기/읽기 가능하다.

- 주의할 점은 기존 배열이나 문자열과 다른게 시작 인덱스 "0"이

  앞쪽이 아닌 뒤쪽(역순)이라는 점이다.

 

관련 함수

- reset(index): index 비트를 "0" 으로 변경  bit[index] = 0;

                 생략시 전체 비트 "0"으로 변경

- set(index, val): index 비트를 val 값으로 변경 → bit[index] = val;

                    여기서 val = "0" or "1"이며, 생략 시 전체 비트 "1"로 변경

- flip(index): index 비트 반전 (0 ↔ 1)

               생략시 전체 비트 반전   !bit[index]

- all() : 모든 비트가 1일 경우 true / 그렇지 않으면 false

- any() : 비트가 1인 것이 하나라도 존재한다면 true / 그렇지 않으면 false

- none() : 비트가 1인 것이 하나라도 존재하지 않는다면 true / 그렇지 않으면 false

                모든 비트가 0인지 확인하는 용도

- size() : bitset size 반환

- count() : 현재 bitset에 있는 비트 "1" 개수 반환

- to_string() : bitset을 문자열로 변환

- to_ulong() : bitset을 unsigned long integer 타입으로 변환

- to_ullong() : bitset을 unsigned long long 타입으로 변환

 

bitset 생성

bitset<5bit;          // 000000

bitset<5bit("10101"); // 문자열 "10101"로 초기화

bitset<20bit(29);    // 10진수 29로 초기화

#include <iostream>
#include <bitset>

using namespace std;

int main() {
       bitset<5> bit("10101");
       cout << bit << "\n";
       int n = bit.to_ulong();    
       cout << "10진수 표현: " << n << "\n";
       if (bit.any())
       {
              cout << "Not Zero" << endl;
       }
       else
       {
              cout << "Zero" << endl;
       }
}

 

bitset 활용

#include <iostream>
#include <bitset>
#include <string>

using namespace std;

int main() {
       bitset<20> bit(11); // 0000'0000'0000'0000'1011
       string str = bit.to_string();
       cout << str << "\n";
       if (bit.any())
       {
              // "1"이 처음 나오는 곳을 find
              // 찾은 지점부터 문자열 끝 부분을 추출
              str = str.substr(str.find('1'));
       }
       else
       {
              str = "0";
       }
       cout << "2진수 변환: " << str << "\n";
       // ------------------------------------------------------
       cout << "bitset 중 1의 개수 : " << bit.count() << endl;
       for (int i = 0; i < bit.size(); i++)
       {
              // bitset은 뒤에서부터 인덱스 접근
              cout << bit[i] << " ";     
       }
       cout << endl;
}

 

Reference

[Jungol] 3293 비트연산 1 

[BOJ] 11723 집합 

[Jungol] 1274 2진수를 10진수로...  

[BOJ] 3449 해밍 거리 

[BOJ] 12813 이진수 연산 

[BOJ] 11811 데스스타 

[BOJ] 2098 외판원 순회 

[Algospot] GRADUATION 졸업학기 

[Jungol] 3292 집합관리 

[BOJ] 13701 중복 제거

반응형

댓글