Print Friendly and PDF

C++/C++입문

[C++] 상수, 쉬프트 연산자

나는야 개발자 2025. 3. 21. 07:48
반응형

진수(선행학습)
- 진수 : 2진수, 8진수, 10진수, 16진수
- 2진수 : 0~1, 
- 8진수 : 0~7, 
- 10진수 : 0~9, 
- 16진수 : 0~9, A~F

- 87을 2진수, 16진수로 변환
- 2진수 : 1010111
- 16진수 : 57

Q. 87 & 53 = ?
- 87 : 1010111
- 53 : 110101

 

결과값

 

상수란?

- 변하지 않는 값, 한번 정한 값은 변하지 않는다

- 상수는 선언과 동시에 값을 지정해야함
- const : 상수를 선언할 때 사용하는 키워드

 

선언

const int iAttack = 0x00000001; // 2진수 :		 1
const int iArmor = 0x00000002; // 2진수 :		    10
const int iHP = 0x00000004; // 2진수 :		   100
const int iMP = 0x00000008; // 2진수 :		  1000
const int iCritical = 0x00000010; // 2진수 :   10000

 

상수로 비트 논리 연산자 연습

// 1 | 100 = 101 | 10000 = 10101
int iBuf = iAttack | iHP | iCritical; 

// 10101 & 1 = 00001
cout << "Attack : " << (iBuf & iAttack) << endl;

//10101 & 10 = 0
cout << "Armor : " << (iBuf & iArmor) << endl;
cout << "Mp: " << (iBuf & iMP) << endl;
cout << "Hp : " << (iBuf & iHP) << endl;
cout << "Critical : " << (iBuf & iCritical) << endl;

 

결과

 

 

연산자 축약형

- 연산자를 줄여서 사용할 수 있다.

// 10101 ^ 100 = 10001
iBuf ^= iHP; // iBuf = iBuf ^ iHP
cout << "iBuf : " << iBuf << endl;

// 10001 ^ 100 = 10101
// XOR을 이용해 껐다켰다 스위치 같은 것도 가능 
iBuf ^= iHP; // iBuf = iBuf ^ iHP
cout << "iBuf : " << iBuf << endl;

// 10101 ^ 100 = 10001
iBuf ^= iHP; // iBuf = iBuf ^ iHP
cout << "iBuf : " << iBuf << endl;

 

쉬프트 연산자

- <<. >>
- 값대 값을 연산하여 값으로 나오게 됨
- 이 연산자 또한 이진수 단위의 연산을 하게 됨

 

연습

Q. 20 << 2 = ?
20 : 10100
20 << 2 = 80
20 << 2 : 101 0000
20 << 3 = 160
20 << 3 = 1010 0000
20 << 4 = 320
20 << 4 = 10100 0000

- 결과 값이 20에 2승 , 20에 3승, 20에 4승이 된다.
- 쉬프트 연산자로 하면 연산이 빠르게 된다.

 

20 >> 1 = 10 
20 >> 1 = 10100 >> 1 = 1010
20 >> 2 = 5
20 >> 2 = 10100 >> 2 = 101
20 >> 3 = 2
20 >> 3 = 10100 >> 3 = 10

- 나누기로 활용한다면 빠르게 연산이 가능하다.
- 나눗셈 이라는 연산 자체가 무거운 연산이라 쉬프트 연산을 이용하면 빠르게 가능 
- 20 / 2 보다 20 * 0.5가 더 빠르고 20 >> 1이 더 빠르다.

 

비트 이동 과정 연습

int iHght = 187;
int iLow = 13560;

int iNumber = iHght;

//iNumber에는 187이 들어가 있음, 이 값을 << 1 이 방향으로 이동 시키면
// 상위 16비트의 값이 들어가게 된다.
iNumber <<= 16;

//하위 16비트를 채운다
iNumber |= iLow;

// High 값을 출력한다
cout << "High : " << (iNumber >> 16) << endl;
cout << "Low : " << (iNumber & 0x0000FFFF) << endl;
//F로 표현하는 이유는 16진수로 표현하기 위함

 

도식화

0000 0000 0000 0000  0000 0000 1011 1011   (187, 10진수)

 << 16을 사용하여 상위 16비트로 이동
 0000 0000 1011 1011  0000 0000 0000 0000   (187 << 16)

 |= iLow로 하위 16비트 채우기 (iLow = 13560 = 0011 0101 0001 1000)
 0000 0000 1011 1011  0011 0101 0001 1000   (최종 iNumber)

   ┌───────────────────────┬───────────────────────┐
   │  High (상위 16비트)   │   Low (하위 16비트)   │
   ├───────────────────────┼───────────────────────┤
   │ 0000 0000 1011 1011   │  0011 0101 0001 1000  │
   │         (187)         │        (13560)        │
   └───────────────────────┴───────────────────────┘

- 해당 방법들은 메모리가 적은 시절 사용했던 방법이라 함

반응형