F.R.I.D.A.Y.

시프트 연산자 본문

DEV/C C++

시프트 연산자

F.R.I.D.A.Y. 2019. 1. 29. 12:16
반응형

 프로그래밍을 어느정도 접하고 나면 필연적으로 접하게 되고 사용하게 되는 연산자가 있습니다.

 비트(bit) 연산자와 시프트(shift) 연산자인데, 이번에 소개를 할 연산자는 시프트 연산자입니다. 비트 연산자는 다음에 시간이 된다면 포스팅하죠.

 


비트

비트 연산자와 더불어 시프트 연산자를 이해하려면 기본적인 메모리 저장 방법을 알아야합니다. 현대의 전자 컴퓨터는 0과 1, 이진수로만 작동을합니다. 따라서 모든 값을 저장하고 연산하는 과정을 이진수로 동작합니다.

 인간이 10이이라고 쓰면, 컴퓨터는 다음과 같이 이진수로 변환을 합니다. 컴퓨터는 메모리를 관리하는 최소 단위가 1바이트이기 때문에 편의상 1바이트 표현으로 사용하겠습니다.

 

0000 1010

 

 1은 어떻게 표현할까요?

 

0000 0001

 

 위와 같습니다.

 


시프트 연산자

 시프트(shift)의 뜻은 무엇일까요?

네이버 사전이 잘 말해주네요, 컴퓨터의 시프트 연산자는 1번 의미와 같습니다. 비트를 시프트, 즉 비트를 옮기는 연산 작용을 합니다.

 

 아까 1을 이진수로 0000 0001 이라고 표현했죠? 이 숫자에 왼쪽 시프트 연산(<<)으로 2를 주면 아래와 같이 값이 변경됩니다.

연산 식 : 0000 0001 << 2

연산 후 : 0000 0100 (10진수 4)

 

 즉, 비트가 연산되는 값만큼 왼쪽으로 이동합니다. 왼쪽 시프트 연산이 있으니 오른쪽 시프트 연산도 있습니다. 오른쪽 시프트 연산은 ( >> )이렇게 사용합니다. 4를 오른쪽으로 두번 시프트 연산 해볼까요?

연산 식 : 0000 0100 >> 2

연산 후 : 0000 0001 (10진수 1)

 

만일, 시프트 연산을 하고난 후의 값이 범위를 넘게되면 넘게된 값들은 다 잘립니다. 예시를 들어볼까요?

연산 식 : (0000) 0100 1001 << 2

연산 후 : (0001) 0010 0100

 1바이트만 넣을 수 있으니 괄호 부분이 날아가버리는데, 이를 오버플로우라고 합니다. 왼쪽 시프트로 값에 문제가 생기면 오버플로우(overflow), 오른쪽 시프트로 값에 문제가 생기면 언더플로우(underflow)라고 합니다.


참고

 Right Shift, 즉 오른쪽 시프트를 할 때는 MSB의 영향을 받습니다. MSB가 0이면 양수, 1이면 음수인데, RShift를 하면 밀리는 비트가 MSB의 값으로 채워지게 됩니다.

  연산 식 : 1000 0010 >> 1

  연산 후 : 1100 0001

 다만, unsigned 타입의 경우에는 무조건 0으로 채워지게 되니 참고하세요. Shift 연산자를 이용할 때는 꼭 unsigned를 이용하시기 바랍니다.


MSB : Most Significant Bit, 최상위 비트를 부르는 약자로서 8Bit ABCD EFGH에서 A 위치에 해당하는 비트를 말한다.

 

연산자 종류

 

비트 연산자 : 종류

비트 연산자의 종류와 연산 방법을 알아봅니다. & (비트 AND, 비트곱) 비트 AND연산자는 양쪽 피연산자(operand) 모두 참값이어야 1을 반환했던 논리 AND(&&) 연산자와 비슷합니다. 양쪽 두 값의 동일 위치에 존..

pang2h.tistory.com

 

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

C언어 프로젝트 생성하기  (0) 2019.03.12
홀수 마방진 풀기  (0) 2019.03.09
클래스의 초기화 순서  (2) 2019.01.28
변수(variables)  (0) 2019.01.25
클래스(class)  (0) 2019.01.25
Comments