[C++] C++에서 사용되는 개념 3탄

Patrick!·2022년 5월 8일
0
post-thumbnail

1. 쉬프트(Shift) 연산

컴퓨터의 경우 n 진수를 통해 데이터를 저장 하는데 이 데이터는 ' << ' & ' >> ' 를 통해 연산할 수 있다. 이를 Shift 연산이라고 한다.

이를 eax에 저장하고 여기에 Shift 연산자를 사용해보자

mov eax, 0x12345678
PRINT_HEX 4, eax (eax = 4byte 이기에 프린트 크기를 입력)
NEWLINE (C++의 endl; / '\n' 의 개념)

shl(shift left) / shr(shift rigth) 의 개념
shl eax, 8 (eax를 왼쪽으로 8칸 이동시켜라)
PRINT_HEX 4, eax
NEWLINE

shr eax, 8
PRINT_HEX 4, eax
NWELINE

이제 움직인 이후, PRINT_HEX로 출력된 eax의 값을들 살펴보자

첫번째 PRINT_HEX 4, eax = 12345678

두번째 PRINT_HEX 4, eax = 34567800

세번째 PRINT_HEX 4, eax = 345678

다음과 같이 출력됨을 확인할 수 있다.

왜 쉬프트(Shift) 연산을 이용하는가 ?

사실 쉬프트 연산의 경우, 값을 2의 배수로 곱하기, 나누기를 연산해야 할 때 유용하다.

shl(shift left) / shr(shift rigth) 의 개념에서
shl => 왼쪽으로 연산 => 곱하기의 개념
shr => 오른쪽으로 연산 => 나누기의 개념 으로 작용한다.

mov eax, 0x12345678 => 1234 5678
0001 0010 0011 0100 0101 0110 0111 1000
해당 값이 쉬프트 연산을 통해 8 칸씩 이동한다고 한다면

shl eax, 8 이후, => 34567800
0011 0100 0101 0110 0111 1000 0000 0000

shr eax, 8 이후 => 345678
0000 0000 0011 0100 0101 0110 0111 1000

정말 왼쪽으로 8칸, 오른쪽으로 8칸을 이동했었음을 확인할 수 있기도 하다.

Shift 의 개념처럼 byte 단위의 개념을 x값 만큼 밀어낸다는 의미의 연산이다.

Shift 연산이 활용되는 곳이 어디일까?

게임서버를 운영할때는 모든 객체에 ObjectID를 부여해서 관리해야한다. 여기에 데이터를 보낼 때, 많은 데이터들을 넣어서 보낸다.

2 = 몬스터 의 데이터를 보내야 한다고 할때, 해당 데이터를 0010 이렇게 저장해서 보낸다. 하지만 해당 데이터는 최상위 비트에서만 읽을 수 있기에 해당 데이터를 빠르게 연산해야 한다. 이때 '쉬프트 연산'이 사용된다.

2. 논리(logical) 연산자

Not And Or Xor 등이 논리연산자 에 해당한다.

이는 일정한 조건에 성립하는가? or 하지 않는가? 에 따라 결과를 결정하는 연산자이다.

조건 A = 단맛, 조건 B = 짠맛, 조건 C = 쓴맛 등이 있다고 가정하자

Not A => 단 맛이 아니다.
A and B => 단맛 과 짠맛
B or C => 짠맛 혹은 쓴맛
C xor A => 쓴맛이면서 달지 않거나 or 쓰지 않으면서 달거나 (뭔가 애매한 친구...)

이러한 연산자들은 그럼 어디에 사용되는걸까 ?

종종 bitflag를 사용할 때 사용된다.

여기서 bitflag는 무엇인가 ?

앞서 데이터를 어떻게 분석/해석하느냐에 따라서 의미가 달라진다고 배웠다.
그럼 0100 0010 이라는 데이터가 있다고 할때
1번의 경우 -> 42 라는 데이터라고 분석할 수 있다.
2번의 경우 -> 0010 에 해당하는 데이터를 플레이어가 특정행동을 할 수 있는 비트데이터로 정의하는 것이다.

여기서 어떻게 논리연산을 적용시키는가?

0100 0010 이라는 데이터를 받았을때 0100 xxxx (xxxx)에 해당하는 부분의 값이 0010인지 확인해보도록 and or not 연산자를 사용하는 것이다.

으잉? 우리가 배운 연산자 중에 xor 연산자는 그럼 활용하는 방법이 다른건가?

xor 연산자는 조금 특별하다.

mov al, 0b11001010
mov bl, 0b10101001

NEWLINE
PRINT_HEX 1, al 
NEWLINE
xor al, bl 
PRINT_HEX 1, al
NEWLINE
xor al, bl 
PRINT_HEX 1, al
NEWLINE

처음 al 의 값이 x라고 가정할 때, xor 연산을 통해 al과 bl 의 연산 값이 al 에 담기게 된다.
(연산 후, al 의 값을 y라고 칭하겠다.)
이후 해당 값에 다시 xor al, bl를 진행하면 다시 x값으로 되돌아가는 특성이 있다.

즉, xor은 동일한 값으로 두 번 연산하면 되돌아오는 특성을 가지고 있다.

그럼 이를 어디에 적용할 수 있는가?
암호학에서 자주 이용되는 방법이라고 한다. (대칭키를 이용하여 사용한다.)

profile
C++와 Unreal Engine / C#과 Unity / Katalon Studio를 통한 자동화 테스트 등을 하루하루 공부한 기록

0개의 댓글