언제 사용? :
- 비트 단위의 조작이 필요한 경우
- 비트 플래그 (Bit Flag)
1Byte는 8bit로 이루어져 있고, 바이트의 개별 비트를 "비트 플래그"라고 한다.
주의 사항 :
시프트 연산시 비트들이 왼쪽, 오른쪽으로 밀려나는데... right shift 연산시 원본값의 부호에 따라서 새롭게 왼쪽에서 생성되는 비트의 값이 달라진다...
때문에 정신건강을 위해서 비트연산시 사용하는 값을 unsigned 로 선언하여 "양(+)" 의 부호를 가지도록 설정하고 사용하자
비트 연산의 종류 :
1. bitwise not (~)
일반적인 "not (!)" 연산자와는 다르다.
단일 숫자의 모든 비트를 대상으로 0->1 , 1->0 으로 뒤바꾸는 연산을 진행한다.
101010 -> 010101
2. bitwise and (&)
둗 숫자의 모든 비트 쌍을 대상으로 and 연산을 진행한다.
and 연산은 비교 대상인 두 비트가 모두 1 이어야 1을 반환하는 연산이다.
1 & 1 = 1
1 & 0 = 0, 0 & 1 = 0
0 & 0 = 0
3. bitwise or (|)
두 숫자의 모든 비트 쌍을 대상으로 or 연산을 진행한다.
or 연산은 비교 대상인 두 비트중 하나라도 1 이면 1을 반환하는 연산이다.
1 | 1 = 1
1 | 0 = 1, 0 | 1 = 1
0 | 0 = 0
4. bitwise xor(^)
두 숫자의 모든 비트 쌍을 대상으로 xor 연산을 진행한다.
xor 연산은 비교 대상인 두 비트가 같으면 0 다르면 1 을 반환하는 연산이다.
1 ^ 1 = 0
1 ^ 0 = 1 , 0 ^ 1 = 1
0 ^ 0 = 0
5. bit left shift (<<)
비트열을 N만큼 왼쪽으로 이동
왼쪽의 넘치는 N개의 비트는 버림된다. (복구 안됨)
오른쪽에 새로 생성되는 N개의 비트는 0의 값을 가진다.
*2를 할때 자주보이는 패턴
6. bit right shift (>>)
비트열을 N만큼 오른쪽으로 이동
오른쪽으로 넘치는 N개의 비트는 버림된다. (복구 안됨)
왼쪽에 새로 생성되는 비트는... 그때 그때 다른 값을 가진다.
일반적으로 부호가 없는 값이라면 0의 값을 가지지만, 부호가 있는 값이었다면 부호를 따라간다...
때문에 unsigned 선언을 해두고 사용하자...
실습 :
// 0b0000 [무적][변이][스턴][공중부양]
// bool 로 만들어도 되지만 상태이상이 많아지면.... 코드가 끔찍해진다.
// 0b1001 : 무적 + 공중부양
// 0b0111 : 변이 + 스턴 + 공중부양
// 무적 상태를 만든다.
//flag = 8; // 비트값을 계산해서 정수형으로 넣어도 되지만 숫자가 커지면 힘들다
flag = (1 << 3); // 훨씬 편하게 부가적인 연산없이 무적상태 표현 가능
// 컴파일러가 알아서 8 로 이해한다.
// 변이 상태를 추가한다.
flag |= (1 << 2); // |연산은 두 값중 하나라도 1이면 1이기에 기존값에 새로운 값을 추가할 수 있다.
// 무적인지 확인하고 싶다? (다른 상태 관심 없음)
// bitmask
bool invincible = (flag & (1 << 3)) != 0; // &연산은 둘다 1이면 1을 반환한다.
// 무적 상태 확인 가능
// 무적이거나 스턴 상태인지 확인하고 싶다면?
//bool stunOrInvincible = (flag & 0b1010) != 0;
bool mask = (1 << 3) | (1 << 1);
bool stunOrInvincible = (flag & mask) != 0; // 두 상태중 하나라도 걸려있다면 0이 아닌 값을 반환할 것
'DirectX11 > Rookiss' 카테고리의 다른 글
함수 객체 (Function Object) (0) | 2024.03.16 |
---|---|
함수 포인터 (0) | 2024.03.16 |
Modern C++_2 (0) | 2024.03.16 |
Mordern C++ (2) | 2024.03.15 |
[게임 프로그래머 도약반] DirectX11 입문_강의노트 (0) | 2024.03.12 |