본문 바로가기

게임개발 수업

비트연산과 쉬프트연산

비트연산이란 무엇인가?

 

비트 + 연산 이다. 연산(+,-,*,/)을 하는 것인데, 이를 비트로 한다는 뜻이다.

 

예를 들어 int a가 있다고 가정해보자.

 

int는 4byte이다.

1byte 1byte 1byte 1byte
(부호비트0)000 0000 0000 0000 0000 0000 0000 0000

메모리에는 실제로 이렇게 저장되어 있다.

 

그래서 int의 경우 32bit로 이루어져 있고, 이중 맨 앞 부호비트 하나를 뺀 31bit로 값을 표현할 수 있다.

 

비트연산이란 이 비트값을 직접적으로 연산한다는 뜻이다.

 

비트 연산은 

 

& and 연산

| or 연산

^ xor 연산

~ not 연산

>> 오른쪽으로 이동 연산

<< 왼쪽으로 이동 연산

 

이 있다.

 

이 방법은 실제로 컴퓨터가 연산하는 방법을 그대로 사용하는 것이다.

 

예를 들어

 

0과 1을 더한다고 한다면,

 

 

 

 

컴퓨터는 이런식(간략하게 표현한다면)으로 덧셈을 한다.

 

int a = 0, int b = 1 이라면

 

a + b 는 실제로

 

(a & b) | (a ^ b) 로 계산이 되는 것이다.

 

편의를 위해 2자리수로 본다면,

a       b

00 & 01 = 00

 

or

 

a       b

00 ^ 01 = 01

-----------------------

01이 되는 것이다.

 

 

winapi에서 이런식의 연산을 사용하는 곳이 있다.

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

 

윈도우 프로시저 콜백함수의 lparam이 이런 연산을 사용한다.

 

lparm은 좌표값을 가지고 있다.

 

int x = lParam & 0x0000FFFF;

int y = (lParam >> 16) & 0x0000FFFF;

y좌표 값 x좌표값
0000 0000 0000 0000 0000 0000 0000 0000

 

여기서 0x0000FFFF = 0000 0000 0000 0000 1111 1111 1111 1111 의 값이다.

 

0x0000FFFF
0000 0000 0000 0000 1111 1111 1111 1111

 

lParam 값와 0x0000FFFF 값을 & 연산 한다는 의미는

 

lParam 값중 뒤의 4byte 값만 가져오겠다는 의미이다.

 

int x = lParam & 0x0000FFFF 로 뒤의 4byte값만 가져온 후 저장한다.

 

그런후에 y값을 가져오기 위해 오른쪽으로 16 쉬프트 연산을 한다.

그후에 다시 뒤의 4byte값을 가져온다.

 

int y = (lParam >> 16) & 0x0000FFFF;

'게임개발 수업' 카테고리의 다른 글

수학-벡터  (0) 2022.12.16
행렬  (0) 2022.12.15
삼각비, 삼각함수  (0) 2022.12.07
WINAPI  (0) 2022.12.05
함수 포인터  (0) 2022.12.01