1. 비트 연산
- 비트 연산의 필요성(자주 사용하지는 않음)
비트 단위의 조작이 필요할 때, 아이디 발급, 몬스터 번호, 캐릭터 직업 등
(1) ~ : bitwise not
단일 숫자의 모든 비트를 대상으로 0을 1로, 1을 0으로 전환함.
(2) & : bitwise and
두 숫자의 모든 비트 쌍을 대상으로 'and' 연산을 함
a = 1 0 0 1 1 1 0 0
b = 1 1 0 1 1 0 0 1
a & b = 1 0 0 1 1 0 0 0
(3) | : bitwise or
두 숫자의 모든 비트 쌍을 대상으로 'or' 연산을 함
a = 1 0 0 1 1 1 0 0
b = 1 1 0 1 1 0 0 1
a | b = 1 1 0 1 1 1 0 1
(4) ^ : bitwise xor
두 숫자의 모든 비트 쌍을 대상으로 'xor' 연산을 함 => 두 숫자가 같으면 0, 다르면 1을 출력
a = 1 0 0 1 1 1 0 0
b = 1 1 0 1 1 0 0 1
a | b = 0 1 0 0 0 1 0 1
팁) 본인을 두 번 'xor' 연산하면 a의 본래 값이 나옴
(5) 비트 시프트
<< : Left Shift
각 비트를 왼쪽으로 이동, 밀려나는 끝의 비트는 삭제(정보가 제거)됨
>> : Right Shift
각 비트를 오른쪽으로 이동, 밀려나는 끝의 비트는 삭제됨
* 왼쪽에 새로 생성되는 비트(왼쪽 끝의 부호 비트) 문제
- 부호 비트가 존재하면 부호 비트를 따라간다 => 부호는 그대로 남기고 나머지 비트만 이동한다
a = 1 0 0 1 1 0 1 0
a << 2
// output : a = 0 1 1 0 1 0 0 0
a = 1 0 0 1 1 0 1 0
a >> 2
// output : a = 0 0 1 0 0 1 1 0
2. 비트 플래그
(1) 4개의 이상상태를 저장하기
// 0b0000 에서 각 비트는 [무적] [변이] [스턴] [공중부양]의 상태를 표현
// 0b0001 : 공중부양
// 0b0010 : 스턴
// 0b0100 : 변이
// 0b1000 : 무적
unsigned char flag; // 부호를 제거하여야 Rsh시에 부호가 따라오지 않음
flag = (1 << 3); // 0b1000, 무적 상태
flag |= (1 << 2); // 0b1100, 무적 + 변이 상태
// 0b0000에서 사이에 새로운 상태이상이 추가되었다면, 1 << 3도 수정이 필요하다
여러 불리언을 사용하는 것 보다 간편하게 표현할 수 있다.
(2) bitmask
// 무적인지 확인하기, 다른 상태는 무시
bool invincible = ((flag & (1 << 3)) != 0); // &을 사용하여 4번째 비트가 1인 값만 찾고 나머지는 무시
// 무적이거나 스턴 상태인지 확인하기
bool stunOrinvincible = ((flag & 0b1010));
'기초 C++ 스터디' 카테고리의 다른 글
1-8. 데이터에 관한 여러가지 팁 (0) | 2023.05.02 |
---|---|
1-7. const와 메모리 구조 (0) | 2023.05.02 |
1-5. 비교 연산과 논리 연산 (0) | 2023.05.02 |
1-4. 산술 연산 (0) | 2023.05.02 |
1-3. 문자와 문자열(Character) (0) | 2023.05.02 |