개발 지식

비트 연산

게임만드는학생 2023. 7. 28. 01:24

비트연산 : 비트단위의 조작이 필요할 때 사용된다.  대표적으로 BitFlag가 있다. 

 

비트연산의 종류

~ (bitwise not ) : 모든 종류의 비트를 뒤집음

 

& (bitwise and) : 모든 비트 쌍을 대상으로 and 연산을 실행

 

| (bitwise or) : 모든 비트 쌍을 대상으로 or 연산을 실행

 

^ (bitwise xor) : 모든 비트 쌍을 대상으로 xor 연산을 실행

     -> xor 연산은 두 번 실행하면 원래의 숫자로 돌아오게 되어 암호학에서 쓰인다. 

 

<< 비트 좌측 이동 : N만큼 왼쪽으로 이동, 왼쪽에 넘치는 건 버리고, 새로 생성되는 건 0으로 생김. 

 

ex) 1바이트 짜리 0100 1010 이 있다고 하자. 이 숫자에 << 4 연산을 실행하면 4비트를 왼쪽으로 민다. 

따라서 1010 0000 이 된다. 

 

>> 비트 우측 이동 : N만큼 우측으로 이동, 오른쪽에 넘치는 건 버린다. 이 연산은 부호비트가 있으면 부호비트는 따르고 나머지 새로운 비트를 0으로 만들고 unsigned 같은 타입의 부호비트가 없는 숫자면  맨 처음 비트도 0으로 만든다. 

 

ex) 1바이트 짜리 1101 0101 >>4 연산을 실행할 때,

-> signed int 면 1000 0101 이 되고

-> unsigned int 면 0000 1101 이 된다. 

 

 

BitFlag

실제로 사용되는 예시를 보면 게임에서의 상태표현에 유용하게 사용된다. 

ex) 4가지 상태가 있다고 하자. [무적][변이][스턴][저지불가]

bool 변수 4개를 이용해도 되지만 bitflag를 이용하면 쉽게 처리할 수 있다. 

 

무적상태는 1바이트 안에서 0000 1000 이렇게 4번째 비트를 1로 만드는 방식으로 처리한다고 하자. 

 

-> 무적 만들기 : flag = ( 1 << 3 )  

-> 변이 상태를 추가 : flag = ( 1 << 2 )

이런 식으로 상태를 표현할 수 있다. 

 

그리고 특정 상태인지 확인할 때는 BitMask를 사용한다. 

 

BitMask 

특정한 비트를 확인할 때 사용되는 기술이라고 이해했다. 

특정비트를 제외한 다른 비트는 신경쓰지 않는다고 해서 Mask가 붙여졌다고 들었다.

 

ex) 무적인지 확인하려고 할 때

-> flag & ( 1 << 3 ) : 이 값이 1 이면 무적이 켜진 것으로 본다. 

 

&연산은 두 개의 비트가 모두 1이어야만 결과값이 1이 된다.

1 << 3 은 1000 이 되고 flag에 무적과 변이 상태라고 한다면 1100 일 것이다. 

현재 flag에 어떤 상태가 켜져있든 1 << 3 을 & 연산 함으로써 상관없이 전부 0이 되고 

오로지 4번째 비트가 1 이냐 0 이냐에 따라 결과가 출력된다.