본문으로 바로가기

아두이노 기초 9. 연산자

category 아두이노/기초 개념 2016. 11. 1. 17:44



연산자


수학적 연산에 사용되는 기호이다. 아두이노에서는 C/C++에 사용되는 모든 연산자를 사용할 수 있다.


대입 연산자와 산술 연산자


수학적 연산이 필요한 경우 사용한다.

주의 : 같다(equal)는 =이 아닌 ==을 사용한다.

대입(=) 연산자 : 연산자 오른쪽의 값을 왼쪽 변수에 대입한다.

더하기(+) 연산자 : 피연산자의 값을 더한다.

빼기(-) 연산자 : 피연산자의 왼쪽 값에서 오른쪽 값을 뺀다.

곱하기(*) 연산자 : 피연산자의 값을 곱한다.

나누기(/) 연산자 : 피연산자의 왼쪽 값을 오른쪽 값으로 나눈다.

나머지(%) 연산자 : 피연산자의 왼쪽 값을 오른쪽 값으로 나눴을 때 구해지는 나머지를 나타낸다.

직접 코딩을 해 보면 쉽게 이해할 수 있다.


복합대입 연산자


다른 연산자와 결합하여 짧게 표현한 연산자 이다.


다른 복합대입 연산자는 연산자를 조합하여 축소해 놓은것이다.

헷갈리기 쉬운 증감연산자를 조금 살펴보면, a와 b변수 모두 값은 10이다.

선 증가 후 연산을 사용한 경우(++a) ++a + 5의 결과 값은 a를 먼저 증가시켰기 때문에 a값은 11이고 5를 더하면 16이 나온다.

(연산이 끝난 후 a값은 11)

선 연산 후 증가를 사용한 경우(b++) b++ + 5의 결과 값은 연산을 먼저 하기 때문에 b의 값은 10이고 5를 더하면 15가 나온다.

(연산이 끝난 후 b값은 11)

두 방법 모두 연산이 끝나면 증가가 되는 것은 동일하지만 연산 전에 먼저 증가를 시킬 것인지 연산 후에 증가를 시킬 것인지 필요에 따라서 사용하면 된다.


관계(비교) 연산자


관계(비교) 연산자의 결과값은 참일경우 1, 거짓일 경우 0을 반환한다. 주로 조건문이나 반복문에서 관계(비교) 연산자를 많이 사용한다. 

C언어에서는 0이아닌 모든 값은 참으로 간주한다.

크다(>) : 연산자 왼쪽 값이 오른쪽 값보다 큰가?

크거나 같다(>=) : 연산자 왼쪽 값이 오른쪽 값보다 크거나 같은가?

작다(<) : 연산자 왼쪽 값이 오른쪽 값보다 작은가?

작거나 같다(<=) : 연산자 왼쪽 값이 오른쪽 값보다 작거나 같은가?

같다(==) : 연산자 왼쪽 값과 오른쪽 값이 같은가?

!=(다르다) : 연산자 왼쪽 값과 오른쪽 값이 다른가?

직접 코딩을 해 보면 쉽게 이해할 수 있다.


논리 연산자


AND, OR, NOT에 대응하는 연산자로서 관계(비교) 연산자와 마찬가지로 결과 값은 참(1) or 거짓(0)으로 반환한다.

논리곱(&&) : 연산자 왼쪽 오른쪽 값이 모두 참일 경우에만 참. (하나라도 거짓일 경우 거짓)

논리합(||) : 연산자 왼쪽 오른쪽 값이 하나라도 참이면 참. (모두 거짓일 경우에만 거짓)

논리부정(!) : 연산자 오른쪽 값을 반전 시킨다. (참일경우 거짓으로, 거짓일 경우 참으로)

직접 코딩을 해 보면 쉽게 이해할 수 있다.


비트 연산자(초보자는 나중에! 필요할 때 보자!)


비트 단위의 연산을 할 때 사용한다. 주로 메모리 공간의 효율성을 높이고 연산의 수를 줄이고자 할 때 사용한다. 주의할 점은 비트 연산자의 연산은 최소 1byte(8bit)를 묶어서 연산한다는 점이다. (아두이노 우노 보드에서 int는 2byte이므로 16bit 단위로 연산한다.)

비트AND(&) : 비트 단위로 AND 연산을 한다.

비트OR(|) : 비트 단위로 OR 연산을 한다.

비트XOR(^) : 비트 단위로 XOR 연산을 한다.

비트NOT(~) : 모든 비트를 반전시킨다.

왼쪽쉬프트(<<) : 비트열을 왼쪽으로 1칸씩 이동시키면서 정수값은 2배로 만든다.

오른쪽쉬프트(>>) : 비트열을 오른쪽으로 1칸씩 이동시키면서 정수값을 2로 나눈다.


비트 연산을 하는 방법

1010

1001

위와 같이 나열을 한 다음 한 비트씩 비교한다. 위 경우 가장 오른쪽 위 아래 값을 AND해보면, 0과 1을 AND 했으므로 거짓, 즉 0이 된다. 마찬가지로 남은 3비트를 모두 AND연산을 해 보면 1000이 되고 10진수로 바꾸면 8이 된다.


MSB(최상위 비트)가 반전되어 부호가 바뀌는 경우 음의 정수를 구하는 방법은 int a = 10;이고 a를 반전시켰다고 가정해 보면 int는 2byte이고 a는 10이므로 2진수로 바꿔보면

00000000 00001010이다. 이를 반전시키면

11111111 11110101이다. 

최상위 비트가 1로 바뀌었으므로 음수를 나타낸다.

음의 정수를 10진수로 표현하고자 한다면 2의 보수를 취하고 부호를 -로 바꿔주면 된다.

1의 보수 00000000 00001010을 취한다음 +1을 하면 2의 보수를 구할 수 있다.

2의 보수 00000000 00001011이 나오게 된다.

이를 10진수로 바꿔보면 11이 나오게 된다.

여기에 -부호를 붙이면 -11이 나오므로 11111111 11110101은 -11이라는 것을 알 수 있다.

다르게 구하는 방법도 있지만 위의 방법이 가장 간단하므로 생략하도록 하겠다.


비트열이 이동하는 과정은

int a = 10;이라 가정하고 비트열을 3칸 왼쪽으로 이동해보면, (a << 3)

00000000 00001010 = 10

1. 1칸 이동 00000000 00010100 = 20

2. 2칸 이동 00000000 00101000 = 40

3. 3칸 이동 00000000 01010000 = 80

이렇게 1칸 왼쪽으로 이동할 때 마다 2배씩 증가하는 것을 확인할 수 있다.

반대로 오른쪽으로 1칸씩 이동하면 2배씩 감소하는 것도 알 수 있다.

비트 연산은 공책을 펴고 직접 손으로 계산하다 보면 금방 익숙해 질 수 있다.


연산자의 우선순위


연산식 중에서 연산자의 우선순위에 따라 최우선인 것부터 실행한다.

어렸을 때 배웠던 사칙연산의 우선순위를 생각하면 된다.

가령 7+5*10/5-3의 값은 몇인가?

1. 5 * 10 = 50

2. 50 / 5 = 10

3. 7 + 10 = 17

4. 17 - 3 = 14

위와같이 더하기 빼기보다는 곱하기 나누기를 먼저해야한다. 

우선순위가 같을 경우(*곱하기 /나누기), (+더하기 -빼기)는 어떻게 해야할까?

사칙연산의 우선순위에서는 우선순위가 같을 경우 왼쪽에서 오른쪽 순으로 계산한다. 이를 연산자의 결합 법칙이라한다.

하나의 수식에서 우선순위가 동일한 연산자일 경우 미리 정해놓은 결합방향에 따라 연산한다.

위에 있는 우선순위는 외울 필요는 없으며 필요할 때마다 찾아보면 된다.

간혹 예상한 값들이 나오지 않는 경우 연산자의 우선순위를 고려하지 않은 경우가 정말 많으니 그 때마다 잊지말고 우선순위를 따져보기 바란다.