파이썬 2진수, 8진수, 16진수
- 2019. 9. 5. 16:42
파이썬 코드 작성 시 대부분 10진수 이외에 다른 진수를 다루는 일은 거의 없습니다. 하지만 때에 따라서 진수 변환을 해주어야 하는 경우가 종종 발생하기도 합니다. 그 한 가지 예로 다음 포스트에서 파이썬 자료형 저장 순서를 테스트해보려 하는데 진수를 사용할 예정이기 때문입니다. 그래서 테스트 글을 작성하기 전에 파이썬 진수에 대해 간단히 알아보겠습니다.
파이썬 진수
파이썬 진수 접두어
이 글을 읽고 계시는 분들은 진수에 대해 잘 알고 계신가요? 혹시나 하는 마음에 진수에 대해 말씀드리겠습니다. 컴퓨터는 기본적으로 2진수 체제로 0과 1로 신호체계로 운용되고 있습니다. 전기적 신호가 있으면 1 없으면 0 이런 식으로 말이지요. 이 0과 1의 정보가 32개가 모여 명령어 셋이나 자료 셋을 이루면 32비트 64개가 모이면 64 비트라고 표현을 합니다. 이런 0과 1의 표현으로만 되어 있는 2진수를 훈련하면 가능하겠지만 사람이 바로 읽어서 이해하기란 쉽지 않습니다. 때문에 0과 1로 이루어진 값을 좀 더 읽기 쉽게 표현하기 위해 8진수(0~7까지)와 16진수(0~F)를 사용하였습니다. 왠지 진수 이야기를 하면 이 포스팅이 진수 관련된 내용이 되어버릴 것 같아서 하고 싶은 말은 많지만 여기까지 하겠습니다.
사람이 숫자 10을 표기하였을 때 컴퓨터는 어떻게 인식을 할까요? 10은 일단 8진수의 범위에서 벗어나고 16진수의 10은 A라고 표기하기 남은 진수는 2진수 혹은 10진수 이겠네요. 경우의 수가 두 가지라 하더라도 컴퓨터에게 확실히 이거다 라고 알려 주어야 합니다. 10을 2진수로 표현했을 수도 있기 때문입니다. 그래서 프로그래밍에서 10진수를 제외하고 다른 진수를 사용할 때 접두어를 사용하도록 약속했습니다. 접두어는 숫자 0을 시작으로 각각의 진수에 맞는 소문자 한자리로 이루어져 있습니다.
- 2진수 = 0b
- 8진수 = 0o
- 16진수 = 0x
2진수의 b = binary, 8진수의 o = octadecimal, 16진수의 x = hexadecimal을 뜻합니다.
파이썬 10진수 에서 다른 진수 변환
# 10진수 19를 2진수 변환
>>> bin(19)
'0b10011'
# 10진수 19를 8진수 변환
>>> oct(19)
'0o23'
# 10진수 19를 16진수 변환
>>> hex(19)
'0x13'
간혹 접두어를 제외한 값만 필요한 경우가 있습니다. 이럴 땐 두 가지 방법이 존재합니다. 반환된 값이 문자열이니 슬라이싱을 하는 방법이 있고 또 하나는 format함수를 사용하는 것입니다.
접두어 제거 (슬라이싱)
# 2진수 접두어 제거 슬라이싱
>>> bin(19)[2:]
'10011'
# 8진수 접두어 제거 슬라이싱
>>> oct(19)[2:]
'23'
# 16진수 접두어 제거 슬라이싱
>>> hex(19)[2:]
'13'
접두어 제거 (format)
format함수는 접두어를 제외 혹은 포함이 가능하여 두 가지 경우를 모두 알려 드리겠습니다.
#===================
# 2 진수
#===================
# 접두어 제외
>>> format(19, 'b')
'10011'
# 접두어 포함
>>> format(19, '#b')
'0b10011'
#===================
# 8 진수
#===================
# 접두어 제외
>>> format(19, 'o')
'23'
# 접두어 포함
>>> format(19, '#o')
'0o23'
#===================
# 16 진수
#===================
# 접두어 제외
>>> format(19, 'x')
'13'
# 접두어 포함
>>> format(19, '#x')
'0x13'
이렇게 놓고 보니 format함수가 #하나로 접두어를 표기하기도 하고 제외하기도 하니 나름 좋은 것 같습니다.
파이썬 다른 진수에서 10진수 변환
지금까지 10진수를 다른 진수로 변환해 보았으니 이제 다른 진수를 10진수로 변환하는 방법을 알려 드리겠습니다. 파이썬에서 스트링을 숫자로 형 변환을 해주는 함수가 있습니다. 바로 int함수입니다. 이 int함수를 이용하면 어떤 진수라도 10진수로 표현이 가능합니다.
# 2진수 10진수 변환
>>> int('10011', 2)
19
>>> int('0b10011', 2)
19
# 8진수 10진수 변환
>>> int('23', 8)
19
>>> int('0o23', 8)
19
# 16진수 10진수 변환
>>> int('13', 16)
19
>>> int('0x13', 16)
19
int함수를 사용하여 10진수로 변환하였습니다. 각각의 진수 값은 접두어가 있으나 없으나 base값으로 넘겨받은 진수 값을 바탕으로 10진수로 변환해 줍니다.