반응형
진수(선행학습)
- 진수 : 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) │
└───────────────────────┴───────────────────────┘
- 해당 방법들은 메모리가 적은 시절 사용했던 방법이라 함
반응형
'C++ > C++입문' 카테고리의 다른 글
[C++] Swich문과 열거체 (0) | 2025.03.22 |
---|---|
[C++] 난수 (0) | 2025.03.22 |
[C++] if문 (0) | 2025.03.22 |
[C++] 변수, 사칙, 논리, 관계 연산자, 비트 논리 연산자, 진수 변환 (0) | 2025.03.18 |
[C++] 1강 프로젝트 생성 및 문자열 출력 (0) | 2025.03.18 |