비트 연산과 비트 플래그

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

비트 연산이란?

 

입력된 두 값을 비트 단위로 나열한 뒤에 비트 연산자로 연산한다.  비트 단위로 연산을 하며 각 자릿수의 연산은 독립적이여서 다른 자릿수의 연산에 영향을 주지 않는다.

 

언제 필요한가?

비트 단위의 조작이 필요할 때 사용. 대표적으로 Bitflag

 

 

비트 연산 종류

 

  • ~ bitwise not 
  • & bitwise and 
  • | bitwise or  
  • ^ bitwise xor 

 

NOT

두 입력값이 뒤바뀜. ->> 0은 1, 1은 0으로 뒤바뀌어 출력

 

AND

두 입력값이 모두 1 ->> 1을 출력

 

OR

하나 이상의 입력값이 1 ->> 1을 출력

 

XOR

입력값이 같지 않으면 ->> 1을 출력

 

 


 

 

 

   비트 시프트

 


 

 

비트 시프트란?

 

비트를 좌우로 이동.

 

 

<< 비트 좌측 이동

  • 비트열을 N만큼 왼쪽으로 이동
  • 왼쪽의 넘치는 N개의 비트는 버림. 새로 생성되는 N개의 비트는 0.
  •  *2를 할 때 자주 보이는 패턴

>> 비트 우측 이동    

  • 비트열을 N만큼 오른쪽으로 이동
  • 오른쪽의 넘치는 N개의 비트는 버림.
  • 왼쪽 생성되는 N개의 비트는 
        - 부호 비트가 존재할 경우: 부호 비트를 따라감 (부호있는 정수라면 이 부분을 유의)
        - 부호 비트가 없는 경우:  0으로 채워짐. ex. unsigned 타입

 

연산자 비트1 비트2 결과 연산 예시
NOT ~ 0 1 1010 1110 (174)
-------------------~
0101 0001 (  65)
1 0
AND  & 0 0 0 0010 0100 (36)
0000 0100 (  4)
------------------&
0000 0100 (  4)
0 1 0
1 0 0
1 1 1
OR | 0 0 0 0100 0001 (65)
0010 1000 (40)
------------------|
0110 1001 (105)
0 1 1
1 0 1
1 1 1
XOR ^ 0 0 0 0110 0001 (97)
0100 1011 (75)
-----------------^
0010 1010

0 1 1
1 0 1
1 1 0
<< << 1 0101 1010 1011 0100  
>> >> 1 1010 0101 0101 0010  

 

 

 


 

코드

 

더보기
#include <iostream>
using namespace std;

unsigned char flag;  // 부호를 없애야 >> 를 하더라도 부호비트가 딸려오지 않음

int main()
{
#pragma region 비트 연산

    // int a = 1;
    // int b = 123;
    // a = a ^ b;
    // a = a ^ b;   //a값이 다시 1로 돌아옴. 

    // 실습
    // 0b0000 [무적][변이][스턴][공중부양]

    // 무적 상태로 만든다.
    flag = (1 << 3);    //값 8
    
    // 변이 상태를 추가한다 (무적 + 변이)
    flag |= (1 << 2);   //값 4

    // 무적인지 확인하고 싶다? (다른 상태는 관심 없음)
    // bitmask
    bool invincible = ((flag & (1 << 3)) != 0);

    // 무적이거나 스턴 상태인지 확인하고 싶다면?
    // bool mask = (1 << 3 | (1 << 1);     다른방식의 코딩 예시
    bool stunOrInvincible = ((flag & 0b1010) != 0);

#pragma endregion

#pragma region 비트 플래그
#pragma endregion
}