본문 바로가기
Algorithm/CodeUp

[CodeUp 기초 100제]1047 : [기초-비트시프트연산] 정수 1개 입력받아 2배 곱해 출력하기(풀이 성공)

by 전봇대파괴자 2021. 2. 8.
# 10진수로 변환
print(int('0b10100', 2))

>> 20
# 10진수로 변환
print(int('0b10100', 2))

>> 20​

입력:

정수 한 개가 입력된다.
단, -1073741824 ~ +1073741823

 

 

출력:

2배 곱한 정수를 출력한다.


내 코드:

x = int(input())
print(x<<1)

 

Comment: 문제 설명부터 대놓고 힌트를 주고 있기에 풀이 자체는 매우 쉽습니다. 다만 비트시프트 연산이 뭐지? 라는 생각이 들죠.

 

겁먹지 말고 비트시프트(bit shift)라는 말을 뜯어보면 조금 이해하기가 쉬워집니다. 비트(bit)는 컴퓨터에서 용량을 표현하는 최소 단위입니다. 0과 1. 두 가지 숫자만으로 모든 것을 표현하는 방법이죠. 여기서는 이진법, 이진법으로 표현된 숫자를 나타냅니다. 시프트(shift)는 '이동하다', '옮기다'의 의미를 가진 영어단어입니다.

 

결국 비트시프트 연산이라는 것은, 이진법으로 표현된 숫자를 이동시키는 연산을 뜻합니다. 숫자? 무슨 숫자요? 입력값으로 들어가는 십진법 숫자이죠. 위의 코드에서는 input으로 들어간 정수값 x라고 할 수 있겠습니다. 예컨대 x=10이라고 하면, 이 10을 이진수인 1010으로 바꿔서 연산을 진행하는데, 그 결과값이 20인 것입니다. 그림으로 보면 다음과 같습니다. 

 

 

이진수로 나타낸 정수 10

0 0 0 0 1 0 1 0

 

칸이 여덟 개인 것은 연산이 1byte를 기준으로 하기 때문입니다. 1byte=8bit이므로, 0 혹은 1을 넣을 수 있는 칸이 8개가 됩니다. 위의 코드에서 어떤 기호가 사용되었는지 기억하시나요? 맞습니다. '<<'였죠? 

 

x<<1

 

이렇게 보니 왼쪽으로 이동하라는 화살표 같군요. 그럼 한 번 1칸씩 이동해 보겠습니다. 

 

 

비트시프트 연산(<<1)을 실행한 후

0 0 0 1 0 1 0 0

 

10100이라는 이진수가 나왔군요. 십진수로 변환해 볼까요?

 

# 10진수로 변환
print(int('0b10100', 2))

>> 20

 

결과값은 20으로 x*2를 했을 때와 동일한 값입니다. 하지만 원리는 차이가 있다는 것을 확인할 수 있습니다. 이 문제의 목적은 단순히 2배를 한 수를 출력하는 것이 아닌, 이런 비트시프트 연산의 원리를 이해하는 것이라고 생각합니다. 이제 비트시프트 연산이라는 말을 봐도 덜컥 겁부터 나지는 않겠군요! 

 

 

 

※ 참고

colossus-java-practice.tistory.com/19 

 

[Chapter 2 연산자] 6. 비트 연산자 - 시프트 연산자 (Shift Operator)

지금까지 다양한 연산자들에 대해서 알아보고 있다. 연산자의 종류는 엄청나게 다양하지만 의외로 우리들이 알고 있는 연산자들도 많고 생각보다 쉬운 연산자들도 더러 있었다. 그런데 이번 시

colossus-java-practice.tistory.com