Logo

파이썬에서 2진수, 8진수, 16진수 다루기

이번 포스팅에서는 파이썬에서 진수를 다루는 여러 가지 방법에 대해서 알아보겠습니다.

다른 진수의 형태로 숫자를 표현하기

파이썬에서는 기본적으로 10진수 형태로 숫자를 표현하기 때문에 다른 진수의 형태로 숫자를 표현하려면 다음과 같이 숫자 앞에 접두어를 붙여줘야 합니다.

  • 2진수: 0b
  • 8진수: 0o
  • 16진수: 0x
>>> 42 == 0b101010
True
>>> 42 == 0o52
True
>>> 42 == 0x2a
True

해당 진수에서 허용하는 범위에서 벗어난 숫자를 사용하면 SyntaxError가 발생하니 주의해야 합니다.

>>> 0b2
  File "<stdin>", line 1
    0b2
     ^
SyntaxError: invalid token

숫자에서 다른 진수의 문자열로 변환하기

파이썬은 bin(), oct(), hex()라는 내장 함수를 제공합니다. 이 함수를 통해서 숫자를 각 진수의 형태의 문자열로 변환할 수 있습니다.

>>> bin(42)
'0b101010'
>>> oct(42)
'0o52'
>>> hex(42)
'0x2a'

함수의 인자로 숫자를 넘길 때, 10진수를 사용하든 2진수를 사용하든 결국 동일한 숫자 값을 다른 진수의 형태로 표현한 것뿐이기 때문에 결과는 동일해야 합니다.

>>> bin(0b101010)
'0b101010'
>>> oct(0b101010)
'0o52'
>>> hex(0b101010)
'0x2a'
>>> str(0b101010)
'42'

다른 진수의 문자열을 숫자형으로 변환하기

bin(), oct(), hex()로 변환한 문자열들을 어떻게 다시 숫자로 변환할 수 있을까요? 평소에 문자열을 숫자로 바꾸기 위해서 자주 사용하시던 int() 함수에 진수의 base 값을 추가 인자로 넘겨주시면 됩니다.

>>> int('0b101010', 2)
42
>>> int('0o52', 8)
42
>>> int('0x2a', 16)
42

사실 int() 함수의 2번째 인자는 디폴트값이 10이기 때문에 생략했을 경우 10진수의 문자열이 숫자로 변환되는 것입니다.

>>> int('42', 10)
42
>>> int('42')
42

추가 팁: format() 활용하기

format() 내장 함수를 이용하면 숫자를 다른 진수의 문자열로 바꿀 때 접두어를 제외할 수 있습니다.

>>> format(42, 'b')
'101010'
>>> format(42, 'o')
'52'
>>> format(42, 'x')
'2a'
>>> format(42, 'X')
'2A'
>>> format(42, 'd')
'42'

물론 접두어를 포함시키는 것도 가능합니다. 두번째 인자 앞에 #만 붙여 주시면 됩니다.

>>> format(42, '#b')
'0b101010'
>>> format(42, '#o')
'0o52'
>>> format(42, '#x')
'0x2a'
>>> format(42, '#X')
'0X2A'

문자열 포맷터를 이용해서 10진수, 2진수, 8진수, 16진수를 한 줄의 문자열로 변환한 예제입니다.

>>> "int: {0:d}, bin: {0:b}, oct: {0:o}, hex: {0:x}".format(42)
'int: 42, oct: 52, bin: 101010, hex: 2a'

전체 코드

본 포스팅에서 제가 작성한 전체 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다.

https://dales.link/zx6

마치면서

이상으로 파이썬에서 진수를 다루는 여러 가지 방법에 대해서 알아보았습니다. 본 포스트에서 다룬 API에 대해서 좀 더 자세히 알고 싶으시다면 아래 링크를 참고 바라겠습니다.