본문 바로가기
프로그래밍언어/C언어

비트 연산자 - << 연산자와 >> 연산자 (왼쪽시프트연산자, 오른쪽시프트연산자)

by J코딩 2021. 9. 30.
반응형
비트 연산자 연산식 설명
& a & b 비트 단위 AND 연산
| a | b 비트 단위 OR 연산
^ a ^ b 비트 단위 XOR 연산
~ ~a 비트 단위 NOT 연산
<< a << 3 왼쪽으로 비트 세 칸 이동
>> a >> 1 오른쪽으로 비트 한 칸 이동


비트를 이동시키는 연산자에는 두 가지가 있습니다. 하나는 << 연산자(왼쪽 시프트 연산자)이고, 하나는 >> 연산자(오른쪽 시프트 연산자)입니다. 이렇게 비트를 이동시키는 연산자를 시프트(Shift) 연산자 또는 이동 연산자라고 부릅니다.

 

먼저 왼쪽 시프트 연산자(<<)에 대하여 알아봅시다. 이 연산자는 비트의 자릿수를 왼쪽으로 이동시키는 연산을 수행합니다. 다음 예제를 가지고 자세히 살펴보겠습니다.

5행에서 정수형 변수 num1를 비트 단위로 10진수를 2진수로 변환한 후,

https://jcoding7.tistory.com/entry/%EC%97%B0%EC%82%B0%EC%9E%90-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%902%EC%A7%84%EC%88%98-10%EC%A7%84%EC%88%98-16%EC%A7%84%EC%88%98-8%EC%A7%84%EC%88%98

 

연산자 - 비트 연산자(2진수, 10진수, 16진수, 8진수)

일상에서 사용하는 수의 표현법은 10개의 숫자(0에서 9)를 이용하는 10진수 체계를 사용합니다. 그렇지만, 컴퓨팅 세계에서 사용하는 수의 표현법은 2개의 숫자(0과 1)을 이용하는 2진수 체계, 16개

jcoding7.tistory.com

<<(NOT) 연산해서 결과를 11행에서 변수 result1에 저장합니다.

11행에서 변수 num1의 데이터를 2비트만큼 왼쪽으로 이동시키고 있습니다. 변수 num1은  10진수 10을 저장하고 있고, 2진수로 0000 1010입니다. 지면 관계상 8비트(1바이트)만큼의 그림으로 표현하겠습니다.

처음으로 num1 << 2에서 변수 num1의 10진수 10을 왼쪽으로 2비트만큼 이동시키면, 왼쪽 2비트가 사라진 자리만큼 전체 비트가 왼쪽으로 이동합니다. 그래서 맨 오른쪽 2비트만큼 빈 공간이 발생하게 됩니다. 그런 다음에는 빈 공간을 0으로 채워 넣습니다. 그래서 최종 출력 결과는 40입니다. 왼쪽 시프트 연산자인 경우 빈 공간은 무조건 0으로 채웁니다.

 

변수 num1의 10을 왼쪽으로 2비트 이동시키느 40이 되었습니다. 만약 num1의 10을 왼쪽으로 1비트 이동시켰다면 결과는 얼마일가요? 결과는 20입니다. 어떤 값을 왼쪽으로 1비트씩 이동시킬 때마다 2가 곱해집니다.

 

다음으로 오른쪽 시프트 연산자(>>)에 대하여 알아봅시다. 이 연산자는 비트의 자릿수를 오른쪽으로 이동시키는 연산을 수행합니다. 다음 예제를 가지고 자세히 살펴보겠습니다.

13행에서 변수 num1의 데이터를 오른쪽으로 1비트만큼 이동시키고 있습니다. 변수 num1은 10진수 10을 저장하고 있고, 2진수로 0000 1010입니다.

먼저 num1 >> 1에서 변수 num1의 10진수 10을 오른쪽으로 1비트만큼 이동시키면, 오른쪽 1비트가 사라집니다. 그러면 전체 비트가 오른쪽으로 이동합니다. 그렇게 되면 맨 왼족에 1비트만큼의 빈 공간이 생기게 됩니다. 그런 다음에는 변수 num1이 양수이므로 빈 공간을 0으로 채워 넣습니다. 그래서 최종 출력 결과는 5입니다.

 

14행에서는 변수 num2의 데이터를 오른쪽으로 1비트 이동시키고 있습니다. 변수 num2는 10진수 -10을 저장하고 있고, 2진수로 1111 0110입니다.

먼저 num2 >> 1에서 변수 num2의 10진수 -10을 오른쪽으로 1비트만큼 이동시키면, 오른쪽 1비트가 사라집니다. 그래서 전체 비트가 오른쪽으로 이동합니다. 그렇게 맨 왼쪽에 1비트만큼의 빈 공간이 생기게 됩니다. 그런 다음에는 변수 num2는 음수이므로 빈 공간을 1로 채워 놓습니다. 그래서 최종 결과는 -5입니다.

 

변수 num1의 10을 오른쪽으로 1비트 이동시켜서 5가 되었고, 변수 num2의 -10을 오른쪽으로 1비트 이동시켜서 -5가 되었습니다. 어떤 값을 오른쪽으로 1비트씩 이동시킬 때마다 2가 나누어집니다.

 

주목할 점은 오른쪽 시프트 연산자는 첫 번째 피연산자의 부호에 따라서 빈 공간을 0 또는 1로 채우게 되는데, 부호가 양수면 0으로 채우고, 부호가 음수면 1로 채웁니다. 적절한 예제들을 스스로 만들어서 시프트 연산자의 개념을 확인해 보기 추천 드립니다.

반응형

댓글