Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

비트 연산자, 플래그 본문

c++ 정리

비트 연산자, 플래그

젼뀨 2024. 6. 5. 20:50

비트연산자를 배우긴 했었지만 코딩테스트할 때 다른 사람의 풀이에서만 보고, 어디에 쓰이는지 몰랐었다.

근데 플래그로 활용할 수 있다고 해서 정리해보려고 한다.


비트 연산자

연산자 의미
& 비트 AND , 대응되는 비트가 모두 1이면 1 반환
| 비트 OR , 대응되는 비트 중에서 하나라도 1이면 1 반환
^ 비트 XOR, 대응되는 비트가 서로 다르면 1 반환
~ 비트 NOT, 비트를 1이면 0으로, 0이면 1로 반전
<< 지정한 수만큼 비트 왼쪽 이동
>> 지정한 수만큼 비트 오른쪽 이동

플래그

 

우선 0으로 초기화 된 변수를 만들고, 비트마다 0/1 로 상태를 체크하고자 한다.

unsigned int emotion = 0;

위의 변수를 사용한다면, 4바이트 크기의 변수이기 때문에, 최대 32가지 상태를 각각 비트에 저장할 수 있다.

 

임의의 상태를 #define으로 정의해보겠다.

#define ANGER 		= 0x01, //0000 0001
#define CONTEMPT 	= 0x02, //0000 0010
#define DISGUST 	= 0x04, //0000 0100
#define FEAR 		= 0x08, //0000 1000
    
#define HAPPINESS 	= 0x10, //0001 0000
#define NEUTRAL 	= 0x20, //0010 0000
#define SADNESS 	= 0x40, //0100 0000
#define SURPRISE 	= 0x80, //1000 0000

// 원한다면 더 많은 상태를 추가할 수 있다.

2의 거듭제곱수로 비트를 표현할 수 있으므로, 16진수를 사용해주면 가독성이 좋아진다.

 

특정 자리 비트 켜기

emotion |= ANGER;

최하단 비트의 상태를 키고싶어 ( | ) 연산자를 사용해주었다. emotion의 최하단 비트가 0이든 1이든 상관없이 1을 반환해주어 ANGER 상태를 켜줄 수 있다.

 

특정 자리 비트 끄기

emotion &= ~FEAR;

( & ) 연산자와 ( ~ ) 연산자를 사용해 원하는 자리의 비트를 끌 수 있다. 처음에는 단순하게 emotion ^= FEAR; 을 사용하면 될거라 생각했지만, 이미 비트가 꺼져있는 상태에서 이 코드를 사용하면 원하는 결과가 안나오게 된다.

 

emotion (임의 값)

0 1 1 0 1 0 0 1

 

~FEAR (0000 1000⑵)

1 1 1 1 0 1 1 1

 

&=

0 1 1 0 0 0 0 1

 

비트 확인

if(emotion&SADNESS)

( & ) 연산자를 사용해 알고싶은 자리의 비트가 0인지 1인지 확인 할 수 있다.


여태껏 게임을 만들며 상태를 표시할 때 enum을 많이 사용했다. 그렇다보니 한 변수에 한가지 상태만 담는 것만 생각해왔는데, 이런 방식도 사용할 수 있다는 것을 처음 알았다. 다음에 사용할 기회가 있다면 응용해 보아야겠다.

'c++ 정리' 카테고리의 다른 글

포인터와 배열  (0) 2024.06.20
포인터  (0) 2024.06.17
지역변수, 전역변수, 정적변수, 외부변수  (2) 2024.06.14
자료형  (0) 2024.06.04
C++을 공부하는 이유, 객체 지향 프로그래밍  (1) 2024.06.04