C++ (3) - 구문, 비트 연산자
본 내용은 어소트락 무료 강의 <C/C++ 무료강의>을 기반으로 공부한 내용을 정리한 것이다. 틀린 내용이 있을 수도 있음.
If / else 구문
앞서 배운 논리 연산자를 이용하여 나타낸 기본 구문 예시코드
Data = 0;
if (0 & 200)
{
Data = 100; // if 구문 내 연산이 True일 경우만 수행
}
if (Data == 100)
{
Data += 200; // False 이므로 코드 수행 X
}
else if (Data == 0) // 이전 If 구문이 거짓이면 다음으로 else if / else 구문 실행
{
Data = 0;
}
if 구문 내 수행 코드가 거짓이라면 컴파일러가 최적화를 통해 코드를 없는 취급한다.
Switch 구문
구문 예시 코드 - (1)
// if 구문과 유사. 경우에 따라 if 구문을 쓰거나 switch 구문을 쓸 때가 다르다
// break가 없으면 중괄호 코드를 탈출하지 못함. 그래서 case 10 밑의 코드까지 실행해버림
switch (10)
{
case 10:
break;
case 20:
break;
default:
break;
}
(1) 코드를 if구문으로 표현이 가능하다
if (iTest == 10 || iTest == 20 || iTest == 30)
{
// if 구문이 참일 시 수행되는 코드
}
else
{
// if 구문이 거짓일 시 수행되는 코드
}
삼항 연산자
if 구문을 간략하게 쓸때 사용하는 연산자. 가독성이 좋지 않아 코드 수를 정말 줄이고자 할 때 사용한다.
int iTest = 20;
iTest == 20? iTest = 100: iTest = 200;
// if 구문
if (iTest == 20)
{
iTest = 100; // if 구문이 참이라면 수행되는 코드
}
else
{
iTest = 200; // if 구문이 거짓이라면 수행되는 코드
}
비트 연산자
Bit 단위로 연산이 진행될 때 사용된다. bit를 밀어낸다고 생각하자. (Bit Shift)
대입 연산자를 이용하여 여러 상태를 나타낼 수 있다.
unsigned char byte = 1; // 0 0 0 0 0 0 0 1
byte <<= 1; // 0 0 0 0 0 0 1 0
byte <<= 2; // 4배 증가
byte <<= 3; // 8배 증가 ---> 2^n 배 증가
byte >>= 1; // 2배 감소 -> 1/2 -> 나머지 발생할 수 있다. -> 2^n 으로 나눈 몫으로 간주
논리 연산자 처럼 곱과 합, 반전이 존재하고 “xor“이라고 하는 특수 기능도 존재한다.
- 비트단위로 연산을 진행
- 비트 곱(&), 비트 합(Shift + \ ), xor(^), 비트 반전(~)
- & : 각 비트 자릿수끼리 둘다 1인 경우 1
- Shift + \ : 각 비트 자릿수끼리 둘 중 하나라도 1이면 1
- ^ : 각 비트 자릿수끼리 같은 수이면 0, 다른 수이면 1
- ~ : 각 비트 자릿수끼리 1이면 0으로, 0이면 1로 반전.
예시로 게임에서 캐릭터의 스테이터스를 나타내고자 한다.
#define HUNGRY 1
int istatus = HUNGRY // 32bit로 특정상태를 표현하고 싶다. -> 각 bit자리가 겹치지 않게 하는 조합이 필요하다.
“배고픔”의 bit칸이 1이면 HUNGRY를 나타내고 0이면 나타내지 않는다. 이런식으로 각 비트자릿수를 채워 나간다. 2개의 상태가 합쳐진 형태도 표현할 수 있다.
// 상태1 + 상태2
#define HUNGRY 1
#define THIRSTY 2
unsigned int istatus = 0;
// 상태 추가
istatus |= HUNGRY;
istatus |= THIRSTY;
여기서 캐릭터가 “목마름” 상태를 가졌는지 if 구문을 통해 체크를 해볼 수 있다.
if (istatus & THIRSTY) // 내가 지정한 bit 자리만 물어보는 것.
{
}
비트 곱을 통해 먼저 체크하여 없던 상태로 만들어 버리고 싶다면 비트 연산자를 이용해 제거할 수 있다. 흔히 특정 자리 비트 제거를 위해 쓰이는 구문이 다음과 같다.
istatus &= ~THIRSTY
지금 까지의 과정을 그림으로 나타내면 다음과 같다.
#define
전처리기 => 컴파일러 과정을 거치는 컴퓨터에서 전처리기의 예시 중 하나로 #define이 있다. #define은 내가 지정한 구문을 특정 값으로 치환한다.
// 코드 맨 첫번쨰 줄에서 <2진수> <16진수>
#define HUNGRY = 1 1 0x1
#define THIRSTY = 2 2 0x2
#define C = 4 4 0x4
#define D = 8 8 0x8
.
.
.
#define N_th = 2^n 2 ^n
#define의 장점
- 코드 가독성이 좋다.
- 코드 유지 보수가 매우 편리하다.