본문 바로가기
IT/C언어

[비와이][C언어] 연산자에 대해서 알아보자 - 2(할당, 삼항, 비트)

by BeeWhy 2021. 6. 27.

2021.06.26 - [임베디드/C언어] - [비와이][C언어] 연산자에 대해서 알아보자 - 1

어제에 이어서 연산자에 대해서 포스팅 하겠습니다.

구 분 연산자 종류
대입 연산자 =
산술 연산자 +, -, *, /, %, ++, --
관계 연산자 <, >, <=, >=, ==, !=
논리 연산자 &&, ||, !
할당 연산자 +=, -=, *=, /=, %=, ...
삼항 연산자 ?
비트 연산자 &, |, ^, ~, <<, >>

에서 할당, 삼항, 비트 연산자에 대해서 알아보겠습니다.

 

할당 연산자

할당 연산자의 모양을 보시면, 산술 연산자와 '='가 결합된 형태인 것이 확인됩니다.

즉, 형태는

위와 같습니다. A와 B를 산술연산을 하고서, 그 결과를 A에다가 다시 대입하여 저장하는 것입니다.

간단한 코드로 테스트를 해보면서 확인해보시면 아래와 같이 해보시면 됩니다. 하나하나 코드를 단계씩 따라가시면 이해가 되실거에요.

#include <stdio.h>

int main(void)
{
    int a = 3;
    

    // a의 현재값은 3
    printf("a의 결과값은 %d\n", a);

    a += 2;     // a = a + 2;
    // a의 현재값은 5
    printf("a +=2 의 결과값은 %d\n", a);
    
    a -= 3;     // a = a - 3;
    // a의 현재값은 2
    printf("a -=3 의 결과값은 %d\n", a);

    a *= 5;     // a = a * 5;
    // a의 현재값은 10
    printf("a *=5 의 결과값은 %d\n", a);

    a /= 3;     // a = a / 3;
    // a의 현재값은 3
    printf("a /=3 읜 결과값은 %d\n", a);

    return 0;
 }

실행결과

 

삼항 연산자

삼항 연산자는 조건을 따져서 그 조건에 따라 결과값을 다르게 출력하는 연산자 입니다.

일반적으로

(조건) ? A : B

와 같은 형태로 사용하게 됩니다.

조건은 a > 0 와 같은 조건식을 말합니다.

해당되는 조건이 만약 참(True)라면, 결과값은 A가 되고,

해당되는 조건이 거짓(False)라면, 결과값은 B가 됩니다.

 

예시를 통해서 살펴보시죠.

#include <stdio.h>

int main(void)
{
    int a = 3;
    int b = 0;

    b = a > 5 ? 1 : 0;
    // a > 5는 거짓이므로, b의 결과값은 0
    printf("b의 결과값은 %d\n", b);

    printf("a는 %s이다\n", a % 2 ? "홀수" : "짝수");
    // 문자열을 출력하도록 사용도 가능하다.
    // 조건의 결과가 0이 아닌 모든 값은 참으로 간주된다.
    // a % 2 는 a를 2로 나눈 나머지 이므로 3을 2로 나눈 나머지는 1이다.

    return 0;
 }

실행 결과

 

 

비트 연산자

비트 연산자는 특히 임베디드 개발자라면 중요합니다. 레지스터 설정을 할 때 비트 연산을 많이 하게 됩니다.

 

연산자 이름 의미
& AND 두 수의 논리 곱
| OR 두 수의 논리 합
^ XOR(Exclusive OR) 두 수의 베타적 논리 합
~ NOT 비트 단위의 논리 부정
<< Left Shift 왼쪽으로 쉬프트 비트 이동
>> Right Shift 오른쪽으로 쉬프트 비트 이동

 

AND

1111 0011(2) & 0011 0001(2) = 0011 0001(2) 가 됩니다.

계산하는 방법은 각각의 동일 비트의 값이 "모두 1이면 결과는 1이고, 그 외는 모두 0"이 됩니다.

 

OR

1111 0011(2) | 0011 0001(2) = 1111 1011(2) 가 됩니다.

계산하는 방법은 각각의 동일 비트의 값이 "둘 중 하나라도 1이면 결과는 1이고, 모두 0이면 결과는 0"이 됩니다.

 

XOR (Exclusive OR)

1111 0011(2) ^ 0011 0001(2) = 0011 0101(2) 가 됩니다.

계산하는 방법은 각각의 동일 비트의 값이 "서로 같으면 1, 서로 다르면 0"이 됩니다.

 

NOT

~0011 1001(2) = 1100 0110(2) 가 됩니다.

즉, 각 비트별로 0이면 1, 1이면 0으로 뒤집어 주면 됩니다.

 

Shift

0000 0011(2) << 4 = 0011 0000(2) 가 됩니다.

0번 비트의 값이 4번 비트까지 옮겨가게 됩니다.

1번 비트는 5번비트로 옮겨지는 것이구요.

즉, 원래의 값에서 모든 값은 왼쪽으로 << '숫자' 숫자 만큼 옮겨주면 됩니다.

 

>> 의 경우응 오른쪽으로 옮겨주시면 됩니다.

1100 0000(2) >> 5 = 0000 0110(2) 가 됩니다.

7번비트는 2번비트 자리로,

6번비트는 1번비트 자리로,

5번비트는 0번비트 자리로 보내주면 됩니다.

나머지 값은 0으로 채워집니다.

즉, 원래의 값에서 모든 값을 오른쪽으로 >> '숫자'의 숫자 만큼 옮겨주면 됩니다.

 

비트 연산을 잘 활용할 줄 아시면, 특히 레지스터 값이나, flag 처리를 할 때 유용하게 쓰실 수 있습니다.

꼭 숙지해두시길 추천드립니다.

댓글