zyeon's 작심삼일 코딩 공부
비트 연산자, 플래그 본문
비트연산자를 배우긴 했었지만 코딩테스트할 때 다른 사람의 풀이에서만 보고, 어디에 쓰이는지 몰랐었다.
근데 플래그로 활용할 수 있다고 해서 정리해보려고 한다.
비트 연산자
연산자 | 의미 |
& | 비트 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 |