Profile
Experience

2018.12.17

GML 차근차근 배워보기. [ 3 ] 연산자 (2)

조회 수 5 추천 수 0
애드블럭을 꺼주시면 서버 운영에 도움이 됩니다.
부탁드립니다.

GML 차근차근 배워보기

 

* 게임메이커 8.0을 기준으로 작성된 강좌입니다.

[ 3 ] 연산자

 

 

7. 비트 연산자

 

비트 연산자는 주어진 변수를 이진법의 차원에서 다루는 연산자이다. 비트 연산자에 속하는 연산자로는 | , & , ^ , ~, << , >> 가 있다. 일단 하나씩 살펴보자.

 

 |( 혹시 어떤 기호를 말하는지 모르는 사람이 있을까봐 이야기한다. Shift + \ 해서 나오는 기호)  연산자는 or연산자라고 불리는데, 두 개의 숫자의 비트를 취합해서 같은 자리에 있는 비트중 하나라도 1이면 1로 계산하는 연산자다. 그림을 통해서 알아보자.

 

 

 

105와 91을 or연산하는 과정이다. 결과와 각각 비교하면서 or 연산에 대해 알아보자. 보면 105와 91을 2진법으로 나타냈을 때 두 수 모두 0인 경우를 제외하고는 항상 결과값이 1인 것을 알 수 있다. 말그대로 or이므로 둘 중 하나라도 1이면 1로 취급한다는 것이다.

 

혹시라도 결과가 진짜 저렇게 나오는지 의심스러운 사람은 아래와 같은 코드를 넣어서 확인해보자.

 

< 생성 코드 > -> 아무 것도 작성하지 않는다.

 

< 제거 코드 >


show_message(105 | 91); 

 

 실행해보면 123이라는 숫자가 창에 뜨는 것을 확인할 수 있을 것이다.

 

 다음은 & 연산자다. & 연산자는 and연산자라고 불린다. 아마 이 것만으로도 어떤 식으로 연산되는지 눈치채는 사람이 있을 것이다. &연산자의 경우는 두 비트가 모두 1일때만 1로 계산한다.

 

 

 

 

위와 같은 수로 실험해보면 105 & 91 = 73이 나온다. 이 것도 진짜 그렇게 나오는 지 궁금한 사람은 직접 테스트해 보자.

 

 다음은 ^ 연산자다. ^연산자는 xor연산자라고 불리는데, 이 연산자의 경우는 두 비트가 다르면 1, 같으면 0으로 취급한다. 

 

 

xor 연산같은 경우에는 상당히 특이한 성질을 많이 갖고 있다. 대표적인 성질중 하나가 a^b^b=a 라는 것이다. 예를 들어 105^91^91을 연산하면 105가 나오며, 26^71^71을 계산하면 26이 나온다. 이러한 '반전'의 성질 때문에 xor 연산자는 암호화등에도 많이 쓰이며(똑같은 수를 반복해서 xor연산하면 원래 수가 나오기 때문에, 단순히 어떤 수와 xor하는 것만으로도 손쉽게 데이터의 암호화가 가능하다.) 그림의 반전 등에도 자주 사용된다. 또, 서로 비트가 달라야 1이기 때문에, 반전시키고 싶은 부분만 1로 설정한 숫자와 xor연산할 경우 그 부분의 비트만 반전시키는 마스크 연산의 효과도 얻을 수 있다.

 

 

 다음은 ~ 연산자다. ~ 연산자는 not 연산이라고 불린다. 단순히 원래 비트를 전부 뒤집어주는 효과를 갖고 있다. ~ 연산자의 경우 숫자의 보수 개념이나 부호 비트 개념등과 관련하여 설명해야할 복잡한 내용이 많으나, 지금 내용을 설명하기엔 시기가 적절하지 않은 듯 하여 이후에 따로 설명토록 하겠다. 지금은 이 연산의 의미만 기억하고 있도록 하자. 

 

 그리고 마지막으로 <<, >> 연산자이다. 이 두 연산자는 쉬프트 연산자라고 불리는데, 연산자의 모양을 보고 직감적으로 생각하면 된다. 

 

 

 예를 들어 9 << 3 을 계산할 경우 9의 비트배열인 1001을 왼쪽으로 3칸 밀고 그 자리에 0을 채워넣어 1001000이 된다. 즉 9 << 3 = 72이다.

 

 

 반대로 9 >> 3을 계산할 경우 9의 비트배열인 1001을 오른쪽으로 3칸 밀고 남는 자리에 0을 채워넣어 1이 된다. 잘리는 부분은 다 없애버리는 것이다.

 

 이 때 생각해볼 점은 비트는 2진법이며, 2진법은 한 자릿수가 올라갈 때마다 수가 2배씩 커지는 특징을 갖고 있다는 것이다. 즉 << n연산을 하면 2진법의 차원에서 수의 자리수를 n칸만큼 옮기는 것이므로 사실상 2^n을 곱하는 것과 마찬가지의 의미를 갖게 된다. 위의 예에서도 9 >> 3 = 72이고 이 때 9 곱하기 2^3  역시 72다.

 

 ) 비트 연산자를 활용한 곱셈 예. 단순 곱셈 연산보다 속도가 더 빠르다.

 

 a<<4 - a = a*2^4 - a = a*16 - a = a*15

 a<<6 - a<<2 = a*2^6 - a*2^2 = a*64 - a*4 = a*60

 

 

8. 논리 연산자

 

논리 연산자의 경우 비트 연산과 유사한 부분이 많다. 사실 쓰임새만 제외하면 원리는 똑같다. 일단 논리 연산자에 속하는 연산자에는 &&, ||, ^^ , ! 가 있다. 하나씩 살펴보자.

 

 && 연산의 경우에는 모두 참일 때 참이며, 아니면 거짓이다. 예를 들어 살펴보자.

 

< 생성 코드 >

 

a=3;

 

< 제거 코드 >

 

show_message( a mod 2==1&&a>2 );

 

실행시켜보면 창에 1(true)이라는 결과가 나타날 것이다. a값이 3이기 때문에 a mod 2 의 값은 1이며 a는 2보다도 크다. 따라서 두 식모두 참이며, 결과값역시 참이된다. 만약 두 식 중 하나라도 거짓으로 바꾼다면 결과값은 0(false)으로 나타날 것이다.

 

 나머지 연산 역시 이와 마찬가지의 형태이며, ||연산의 경우에는 or(둘 중 하나라도 참), ^^연산의 경우에는 xor(둘의 진위 여부가 반대면 참, 아니면 거짓)을 나타낸다. !의 경우에는 ~와 유사하게 해당 식이 참이면 거짓, 거짓이면 참을 나타낸다.

 

9. 복합대입 연산자

 

 복합대입 연산자의 경우 간단한 연산과 대입과정을 쉽게 처리하기 위해 존재하는 연산자이다. 복합대입 연산자에 속하는 연산자에는 +=, *=, -=, /=이 있다. 아마 모양만으로도 쉽게 감이 올 것 같다.

 

 +=연산자를 예로 들어 복합대입 연산자를 이해해보자. a+=b; 라는 구문의 경우 a= a+b;라는 구문과 동일한 의미를 가진다. 아마 이것만으로도 설명이 충분할 것이다. 즉, 더하고 대입한다 라는 과정을 간단하게 적기 위해 존재하는 것이 +=인 것이다. -=,*=,/= 모두 마찬가지이며 a-=b 는 a= a-b와 같은 의미를, a*=b 는 a=a*b와 같은 의미를, a/=b는 a=a/b와 같은 의미를 가진다. 약간 아쉬운 점은 쉬프트 연산자나 div, mod에 대한 복합대입 연산자를 제공하지 않는다는 점이다. C언어에 익숙한 사람의 경우 은근히 불편할 수 있다.(++ , -- 연산자를 지원하지 않는다는 것도)

 

 

10. 괄호 연산자

 

 연산에는 기본적으로 우선순위라는 것이 있다. 초등학교만 졸업했다면 누구나 알고 있는 상식이다. 덧셈보다 곱셈을 먼저 계산한다는 것이 가장 대표적인 규칙이다. 물론 GML에도 마찬가지 규칙이 적용되며, 모든 연산자들은 제각기 논리적으로 합당한 연산 순위를 갖고 있다. 괄호 연산자의 경우 이 연산 순위를 바꾸어주는 역할을 한다. 괄호 연산자에 속하는 연산자는 ()밖에 없으며, 먼저 연산하고 싶은 식에 () 이 괄호를 씌워주면 해당 연산부터 수행한다. 수학에서 괄호의 역할과 동일하다고 보면 된다.

 

11. 연산 순위

 

괄호 연산자에서 연산 순위에 대해 이야기했다. 아래는 GML에서 연산자들의 연산 순위이며, 반드시 이 연산순위를 기억하고 있어야할 필요는 없다. 사실 연산 순위를 몰라도 적당히 순서에 알맞게 괄호 연산자만 사용해주면 원하는 결과를 얻을 수 있다. 단, 혹시라도 연산순위의 실수로 버그가 발생할 경우 해당 버그를 잡아내기가 매우 힘들기 때문에, 항상 머릿속에 연산순위의 존재를 넣어두고 있어야할 필요성은 있다.

 

 아래는 각 연산자들을 연산순위 순서대로 나열한 것이다. 아래로 갈 수록 연산순위가 낮다(나중에 연산된다.) 같은 줄에 있는 것은 연산순위가 동등하다. 연산순위가 같은 경우 식에서 왼쪽부터 순서대로 연산하게 된다.

 

() 괄호 연산

+-(부호연산자),~,!

*,/,div,mod

+ - (덧셈뺄셈)

<< >>

| & ^

< <= == != >= >

&& || ^^

=(대입) *=,/=,+=,-=



Profile
2
Lv

0개의 댓글

번호 제목 글쓴이 날짜 조회 수
공지 게임메이커 구체적인 설명과 알면 매우 좋은 팁 30개 [장문] 7 profile 도개걸윷모 2018.11.03 186
64 [팁] <댓글 스티커>, <쿠키 마켓>의 쿠키 반환 비율 (수수료, 이익 비율) 2 profile 며르치 2019.01.21 33
63 [팁] 쿠키 얻기/쓰기 조건 정리 4 profile 며르치 2019.01.17 60
62 [쿠키 API] ini처럼 온라인 데이터 저장/불러오기 구현하기 3 profile 주인장수표 2018.12.26 65
61 [쿠키 API] 구글, 네이버, 카카오톡 로그인 구현하기 profile 주인장수표 2018.12.26 52
60 인벤토리 만들기 - 1 profile Experience 2018.12.18 36
59 간단한 도트 찍는 방법! profile Experience 2018.12.17 23
58 [자료] 스팀 게임 플레이어의 통상적 컴퓨터 사양 1 profile 주인장수표 2018.12.17 21
57 [변수의 활용] VAR (if) 액션과 컨트롤액션 profile Experience 2018.12.17 6
56 윈도우를 컨트롤하자! profile Experience 2018.12.17 16
55 GML 차근차근 배워보기. [ 4 ] 조건문 profile Experience 2018.12.17 7
GML 차근차근 배워보기. [ 3 ] 연산자 (2) profile Experience 2018.12.17 5
53 GML 차근차근 배워보기. [ 3 ] 연산자 (1) profile Experience 2018.12.17 10
52 GML 차근차근 배워보기. [ 2 ] 변수 (2) profile Experience 2018.12.17 8
51 GML 차근차근 배워보기. [ 2 ] 변수 (1) profile Experience 2018.12.17 11
50 GML 차근차근 배워보기. [ 1 ] 강좌 진행 환경 조성 2 profile Experience 2018.12.17 8
49 리얼리티 '뷰' 노이즈 강좌 profile Experience 2018.11.29 14
48 [윈도우] 게임을 실행할 때 다른 윈도우를 모두 최소화시키기 profile Experience 2018.11.29 13
47 간단한 8방향 이동 코드 profile Experience 2018.11.29 9
46 겜스 간단한 페이드인/페이드아웃 profile Experience 2018.11.29 11
45 게임메이커 8 강좌 5화 -룸- END profile Experience 2018.11.29 13
서버에 요청 중입니다. 잠시만 기다려 주십시오...