프로그래밍/C++

#18. 비트 연산과 비트 플래그

코딩하는상후니 2022. 7. 16. 22:05

 
*비트 연산
=> 비트 단위의 조작이 필요할 때.
 
 
~  => bitwise not
단일 숫자의 모든 비트를 대상으로, 0 -> 1 , 1 -> 0 으로 뒤집는 것.
 
 
&  => bitwise and
두 숫자의 모든 비트 쌍을 대상으로, and 를 한다.
 
 
|   =>  bitwise or
두 숫자의 모든 비트 쌍을 대상으로, or 를 한다.
 
 
^  =>  bitwise xor
두 숫자의 모든 비트 쌍을 대상으로, xor 를 한다.
 
int a = 1;
int b = 123;
a = a ^ b;
a = a ^ b;
=> 다시 a = 1 이 됨.
 

 
*시프트연산
 
<<   :  비트 좌측 이동
비트열을 N 만큼 왼쪽으로 이동
왼쪽의 넘치는 N 개의 비트는 버린다. 채워지는 비트는 0 이됨.
*2 를 할 때 자주 보이는 패턴
 
 
>>   :  비트 우측 이동
비트열을 N 만큼 오른쪽으로 이동
오른쪽의 넘치는 N 개의 비트는 버린다.
왼쪽 생성되는 N 개의 비트는 부호비트가 존재하면 부호비트를 따라감.
unsigned 라면 0 으로 채워짐.
 
=> 따라서, 비트단위로 조작할 때는 unsigned (부호없는) 을 사용해야 정신건강에 좋다.
 

 
*비트 flag 예시
unsigned char flag;

int a = 1;
int b = 123;

a = a ^ b;
a = a ^ b;

//0b0000 [무적][변이][스턴][공중부양] - bitflag
const int Invincible = 3;

//(무적)
flag = (1 << 3);

//(무적 + 변이)
flag |= (1 << 2);
//flag = (0b11 << 2);

//무적인지 확인하고 싶다 ??
//bitmask
//bool bInvincible = ((flag &= (1 << 3)) != 0);
bool bInvincible = flag &= (1 << 3);

//무적이거나 스턴 상태인지 확인하고 싶다면 ??
unsigned char stunAndinvincible = (1 << 3) | (1 << 1);
//bool Istrue = stunAndinvincible & flag;
bool Istrue = flag & ((1 << 3) | (1 << 1));
 
 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

'프로그래밍 > C++' 카테고리의 다른 글

#19. const, define  (0) 2022.07.17
#19. static 정적변수  (0) 2022.07.17
#17. 비교 연산과 논리 연산  (0) 2022.07.16
#16. 산술 연산  (0) 2022.07.16
#15. UTF & ASCII  (0) 2022.07.16