[Unity][게임수학] 비트연산의 대한 이해

Yoo Hyung Joo ·2023년 10월 31일
0

비트연산이란 무엇인가??
우리는 비트연산이란 단어를 말하면 생각나는 기호가있다.

>>, << ,&, |, ^, ~

이러한 기호들이 있다.

1. >> 우 쉬프트 연산 : 지정한 수만큼 비트를 오른쪽으로 연산
2. << 좌 쉬프트 연산 : 지정한 수만큼 비트를 왼쪽으로 연산
3. & AND 연산.      : 대응되는 비트가 모두 1이면 1반환 
4. | OR 연산.       : 대응되는 비트가 하나라도 1이면 1반환
5. ^ XOR 연산       : 대응되는 비트가 서로 다르면 
6. ~ NOT 연산       : 대응되는 비트의 반대를 반환 ( 0 => 1, 1 => 0 )

비트연산을 왜 사용하는가???
비트연산은 기본적으로 이진수로 사용된다. 아니 우리는 10진수를 사용하는데 이진수를 사용하는 비트 연산을 왜 사용하지? 라는 말을 할 수 있다. 하지만 비트연산의 가장 큰 장점이 있다.

연산 속도가 매우 빠르다는 것이다.

계산은 근본적으로 0과 1로만 이루어진 숫자로 계산을 하기 때문에 비트연산에서 사용하는 이진수는 매우 계산이 빠르게 된다. 또한 이러한 비트 연산의 가장 많이 쓰이는 예로는 FLAG가 있다.

FLAG 연산이 뭔데??
FLAG 연산은 이진수를 마치 bool값 처럼 사용하는 것이다.예를들어 '0001'로 되어있으면 1을 true라고 생각하고 나머지 0을 false라고 생각하는 것이다. 이것을 FLAG 처럼 사용한다고 FLAG 연산이라고 한다.

이것을 이용하면 버프 시스템을 간단하고 빠르게 구현할 수 있다. 예를들어 '0011' 이라는 FLAG값을 가지고 있으면, 버프 1,2는 true, 버프 3,4 는 false로 되어있다고 할 수 있다. 이것과 비슷한 방식으로는

Unity의 Layer시스템이 있다.

Unity의 각각의 오브젝트의 Layer를 달아 카메라 렌더링이나 오브젝트가 특정 레이어인지 확인 할 수 있도록 만들어 놓은 시스템이다.

유니티에서 레이어 값을 가져오면 1~16처럼 상수를 반환하게 된다.
ex)

int layer = LayerMask.NameToLayer("Player");
if(gameObject.layer == layer)
{
	Debug.Log("It is player");
}

또한 이러한 Unity의 Layer시스템을 간편하게 사용하기 위한 LayerMask시스템이 있다.

LayerMask

LayerMask는 이러한 Layer를 간단하게 FLAG 계산을 할 수 있도록 도와주는 시스템이다. LayerMask는 마치 Enum을 넣느 것 처럼 미리 정의된 Layer들을 중복으로 정의해줄 수 있다.

이러한 방식으로 Layer들을 설정해준 뒤 비트연산을 이용해 사용한다.

LayerMask에서는 선택된 Layer를 이진수로 가지고 모두 1을 정해진 상수 만큼 쉬프트, 비트연산을 통해 각각의 상수를 순서대로 설정해준다.
ex)

1 => 000001, 2 => 000010, 3 => 000100

이것을 모두 합치면 000111이 되는데 이것과 현재 비교할 오브젝트의 레이어를 AND 연산하여 그 값이 1보다 크게 되면 true를 반환해준다.

왜 1보다 커야되나?
예를 들어 비교할 Layer의 값이 4라고 치자 이 것을 쉬프트 하면 001000이 된다. 이것과 아까 만들어놓은 000111과 AND 연산을 하게되면 000000이 나온다. 우리는 1,2,3 을 Layer를 해놓았지만 4는 겹치지 않기 때문에 0이 나와 false를 반환하게 된다. 만약 3이 나오게 되면 AND 연산을 하게 되었을 때 AND연산을 하면 000100이 나오기 떄문에 true를 반환해주게 된다.

총 정리

비트연산은 속도가 빠르며, 메모리도 적게 사용한다. 그렇기 때문에 비트연산을 사용할 수 있는 곳에서는 왠만하면 사용하는 것이 좋다. 특히나 버프 시스템, Layer와 같은 시스템을 구현하면 매우 유용하다.

느낀점
Unity Layer를 사용할 때 왜 비트연산을 사용하는지 몰랐는데, 이번에 공부하면서 정확히 쉬프트가 무슨 의미로 사용하는지 알게되는 계기가 되었다.

profile
성장을 멈추지 않는 개발자

0개의 댓글