문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들

C++문법/ 비트 연산 및 활용(비트플래그) , <bitset>

게임이 더 좋아 2021. 12. 1. 16:22
반응형
728x170

비트는 아주 유용하다.

이 문제를 풀 때 차원을 어떻게 표현하지? 라고 생각했지만

누군가가 비트라고 속삭여서 풀 수 있었다.

[문제풀이(Problem Solving)] - 백준, BOJ, 1194번, 달이 차오른다 가자 4 : C++ [CPP] ******

 

이러한 비트에 대해 알아보도록 하자.

 


 

우선 bitset이라는 STL부터 알아보자

 A bitset stores bits (elements with only two possible values: 0 or 1, true or false, ...)

0, 1의 값을 보통 가진다.

**false, true 로도 사용함.

 


 

비트셋(Bitset) 함수들

 

bitset<개수> 이름; bitset 선언

bit.set() 모든 비트 1로 초기화

bit.reset() 모든 비트 0으로 초기화

bit.set(n, true/false) n번째 비트를 조작

bit.size() bitset의 크기

bit.count() 값이 1인 비트의 수

 

 

bit.all(), bit.any(), bit.none()

all() : 비트셋에서 모든 비트가 1일 경우 true, 그렇지 않으면 false
any() : 비트셋에 비트가 1인 것이 하나라도 존재한다면 true 그렇지 않으면 false
none() : 비트셋에 비트가 1인 것이 하나라도 존재하지 않는다면 true 그렇지 않으면 false
 

bit.flip() 전체 비트를 반전

**bit.flip(n) n번째 비트를 반전 -> 1이면 0으로, 0이면 1로

 

bit.test(n) n번째 비트를 검색(1인지 0인지 확인)

** bit.test[4] == bit[4] 배열처럼 인덱스로 이용가능
**다만 0번째 비트가 최하위 비트고
Big Endian에서는 가장 마지막 비트를 0이라고 생각하면 된다.

bit.to_string() 전체 비트를 string으로 캐스팅

 

**써먹으려면 가장 중요한 것. 바꿔줘야함.

bit.to_ulong() / bit.to_ullong() :: 전체 비트를 unsigned long / unsigned long long 의 값으로 바꿔준다.

**int로 바꾸고 싶다면

int num = (int) bit.to_ulong(); //으로 선언하면 됨

 

 


 

bit.set으로 하나하나씩 하는 것보다는 비트연산자를 이용해서 많이 쓰이는데

AND, OR, XOR을 이용해서 특정 상태를 변화시키는 데에 쓰인다.

 

특정 위치 비트 상태값 1로 바꾸기

 

현재 상태가 00010011 이라고하자.

우리가 8번쨰 비트와 6번째 비트를 1로 바꾸고 싶다..?

101 << 6을 하면 

10100000가 만들어진다. 

이 비트를 서로 OR 연산하면

10110011이 되어 우리가 원하는대로 작동했다.

 

특정 위치 비트 상태값 0으로 바꾸기

 

현재 상태가 10110011 이라고하자.

우리가 8번쨰 비트와 6번째 비트를 0으로 바꾸고 싶다..?

 그렇다면 해당 비트만 0인 비트를 만들어낸다. 

01011111가 만들어진다. 

이 비트를 서로 AND 연산하면

00010011이 되어 우리가 원하는대로 작동했다.

 

728x90
반응형
그리드형