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