본문 바로가기
Programming/C Memo

05. 연산자(2) [ 비트, 시프트, 삼항, 대입]

by (J&M) 2020. 2. 10.

본 글은 C언어를 배우고 나서 복습 겸 정리한 글입니다.

 

비트 연산자


비트 연산자

비트 연산자 는 비트를 연산하기 위한 연산자이다.

bit(비트)는 정보의 최소 단위로, 하나의 비트는 0이나 1의 값을 가질 수 있다.

1 bit(비트) = 8 byte(바이트)

 

연산자 역할
~ (NOT) 비트 반전
& (AND) 두 비트가 모두 1이어야 1
| (OR) 두 비트 중 하나만 1이어도 1
^ (XOR) 두 비트가 같으면 0, 다르면 1

 

참, 거짓 (1, 0)으로만 연산을 해보면 논리 연산과 결과는 같다.

XOR만 예를 들어보자면,

A = 0, B = 0 일때 A^B = 0,

A = 1, B = 1 일때 A^B =0 이고,

A = 1, B = 0 일때 A^B = 1이다.


시프트 연산자

시프트 연산자는 비트의 자리를 이동 시킬 수 있는 연산자이다.

<< 는 왼쪽으로 비트 이동, >>는 오른쪽으로 비트 이동

 

아래와 같이 a라는 이름의 변수 8비트 (=1바이트) 공간에

10진수 숫자 2가 이진수로 표현이 되어 저장되어 있다고 해보자

a = 

128 64 32 16 8 4 2 1
0 0 0 0 0 0 1 0

여기서 왼쪽 시프트 연산을 2만큼 하게되면 왼쪽으로 2번 비트 이동하여

a<<2 => 0000 1000가 되고 이는 10진수로 8이 된다.

다시 오른쪽 시프트 연산을 2 만큼 하면 오른쪽으로 2번 비트 이동하여

a>>2 => 0000 0001가 되고 다시 2가 된다.

 

만약 시프트 연산을 하고 난 뒤, 값이 해당 범위를 넘어서면 값이 없어지는데

방향에 따라 오버플로우(overflow), 언더플로우(underflow)라고 한다.

 

예를 들어,

0110 0011 이 있는데 이를 왼쪽으로 두번 시프트 연산을 하게 되면, 1000 1100 이 된다.

값이 왼쪽으로 밀리면서 원래 제일 왼쪽에 있던 1이 사라져 버린다.

이때 오버플로우가 일어난 것 이다.

 

0110 0011 을 오른쪽으로 두번 시프트 연산하면, 0001 1000 이 된다.

제일 오른쪽에 있던 1 두개가 밀리면서 사라져 버리는데 

이때는 언더플로우가 일어난 것이다. 

 

삼항 연산자


삼항 연산자

삼항 연산자는 피연산자가 3개 이다.

조건 ? A : B

조건을 판단하여 참이면 A를 반환하고, 거짓이면 B를 반환한다.

#include <stdio.h>

int main()
{
    int num1 = 6
    int num2 = 3;
    
    LARGER = (num1 > num2) ? num1 : num2;
    
    printf("둘 중 더 큰 수는 %d입니다.", LARGER);
    
    return 0;
}

위 코드의 실행 결과는 둘 중 더 큰 수는  6입니다. 일 것이다.

 

분석을 해보면 num1이라는 변수에 6이 저장되었고 num2라는 변수에 3이 저장되었다.

LARGER라는 변수에는 오른쪽에 있는 삼항 연산의 결과가 저장이 되는데

삼항 연산을 보면 조건"num1이 num2보다 크다"이고 

이 조건이 이면 num1이, 거짓이면 num2가 반환이 되는 것이다.

 

이 코드에서는 num1이 6으로 3의 값을 가진 num2 보다 크므로 삼항 연산의 결과는

num1의 값인 6이므로 LARGER라는 변수에는 6이 저장된다.

 

따라서 출력문의 %d에는 6이 출력되는 것이다.

 

대입 연산자


대입 연산자

대입 연산자는 말그대로 대입을 하는 연산자이다.

왼쪽 피연산자에 오른쪽 피연산자를 대입한다.


복합 대입 연산자

복합 대입 연산자는 산술을 한 후 대입을 하는 연산자이다.

연산자 사용법 같은 뜻
+= a += 2 a = a + 2
-= a -= 2 a = a - 2
*= a *= 2 a = a * 2
/= a /= 2 a = a / 2
%= a %= 2 a = a % 2
&= a &= 2 a = a & 2
|= a |= 2 a = a | 2
^= a ^= 2 a = a ^ 2
>>= a <<= 2 a = a >> 2
<<= a <<= 2 a = a << 2

같은 뜻이라는 칸에 적힌 식이 복합 대입 연산자에 있는 것과 같은 결과가 나오는 것은

대입 연산자가 다른 연산자들에 비해 우선순위가 낮아 다른 연산이 수행 되고나서 대입이 이루어지기 때문이다.

 

 

'Programming > C Memo' 카테고리의 다른 글

07. 입력  (0) 2020.02.10
06. 출력과 주석  (0) 2020.02.10
04. 연산자(1) [산술, 비교, 논리]  (0) 2020.02.09
03. 자료형  (0) 2020.02.09
02. 변수와 상수  (0) 2020.02.09

댓글