본문으로 바로가기
반응형

프로그래밍에서는 숫자를 다양한 진법으로 변환해서 사용합니다. 특히 네트워크 프로그램에서는 데이터를 16진수로 변환해서 주고받습니다. 그 외 다양한 곳에서 진수 변환이 이루어집니다. 오늘은 파이썬에서 제공하는 함수들을 이용해서 진수 변환 방법을 알아보겠습니다. 샘플은 10진수와 2, 8, 16진수 간의 변환 방법들입니다.

 

1. 10진수 -> 2진수, 8진수, 16진수 내장함수 이용해서 전환

 

10진수는 내장함수 bin(), oct(), hex() 을 이용해서 진수별로 변환할 수 있습니다. 반환 완료한 값의 자료형은 문자열인 string 타입입니다.

 

  • bin() : 10진수 -> 2진수
  • oct() : 10진수 -> 8진수
  • hex() : 10진수 -> 16진수
a = 200
print(f"10진수 : {a}")

b = bin(a)
print(type(b))
print(f"2진수 : {b}")

c = oct(a)
print(f"8진수 : {c}")

d = hex(a)
print(f"16진수 : {d}")

[결과]
10진수 : 200
<class 'str'>
2진수 : 0b11001000
8진수 : 0o310
16진수 : 0xc8

 

10진수에서 반환한 각 문자열에서 접두어를 통해 진수를 구분할 수 있습니다. 접두어는 숫자 0 과 각 진수의 영어 단어에 해당하는 소문자 하나로 구성합니다.

 

  • 2진수 : 0b(binary)
  • 8진수 : 0o(octadecimal)
  • 16진수 : 0x(hexadecimal)

 

2. 10진수 -> 2진수, 8진수, 16진수 format 함수를 통한 변환

 

다음은 format 함수를 이용하는 방법입니다.  진수 변환 후 접두어를 출력하는 방법과 접두어를 제외한 문자열을 반환하는 방법 두 가지가 있습니다. 예제처럼 # 을 추가하면 0b, 0o, 0x 접두어를 포함한 문자열을 반환합니다.

a = 200

# 접두어 포함
b = '{:#b}'.format(a)
print(f"2진수 : {b}")

c = '{:#o}'.format(a)
print(f"8진수 : {c}")

d = '{:#x}'.format(a)
print(f"16진수 : {d}")

b = format(a, '#b')
print(f"2진수 : {b}")

c = format(a, '#o')
print(f"8진수 : {c}")

d = format(a, '#x')
print(f"16진수 : {d}")

[결과]
2진수 : 0b11001000
8진수 : 0o310
16진수 : 0xc8
2진수 : 0b11001000
8진수 : 0o310
16진수 : 0xc8

 

두 번째는 접두어를 반환하지 않는 방법입니다. 두 번째 매개변수에 # 특수문자를 제외합니다. format 함수의 두 번째 매개변수로 변환할 진수를 나타내는 영어 단어인 2진수(b), 8진수(o), 16진수(x) 를 입력합니다. 결과값은 접두어가 없는 문자열을 반환합니다.

# 접두어 제외
b = format(a, 'b')
print(f"2진수 : {b}")

c = format(a, 'o')
print(f"8진수 : {c}")

d = format(a, 'x')
print(f"16진수 : {d}")

[결과]
2진수 : 11001000
8진수 : 310
16진수 : c8

 

3. 2진수, 8진수, 16진수 -> 10진수로 변환하기

 

다음은 int 내장함수를 이용해서 역으로 2, 8, 16진수를 10진수로 변환하는 방법입니다. 형식은 int(문자열, 진수) int(숫자) 두 가지가 있습니다. int(문자열, 진수) 는 첫 번째 매개변수로 각 진수에 해당하는 문자열을 입력하고, 두 번째 매개변수로 변환하고자 하는 진수를 숫자로 입력합니다.

# int 함수를 이용한 변환
a = "0b11001000"
print("2진수 -> 10진수 : ", int(a, 2))

b = "0o310"
print("8진수 -> 10진수 : ", int(b, 8))

c = "0xc8"
print("16진수 -> 10진수 : ", int(c, 16))

[결과]
2진수 -> 10진수 : 200
8진수 -> 10진수 : 200
16진수 -> 10진수 : 200

 

만약 첫 번째 매개변수에 문자열을 입력하지 않으면 오류가 발생합니다.

# int 함수를 이용한 변환
a = 0b11001000
print("2진수 -> 10진수 : ", int(a, 2))

[결과]
Traceback (most recent call last):
  File "D:/Project/Workspace/workspace-python/tensorflow-sample/notstop/python/trans_sample.py", line 45, in <module>
    print("2진수 -> 10진수 : ", int(a, 2))
TypeError: int() can't convert non-string with explicit base

 

두 번째인 int(숫자) 형식은 문자열이 아닌 진수 변환한 값을 int() 함수의 매개변수로 입력합니다.

a = 0b11001000
print("2진수 -> 10진수 : ", int(a))

b = 0o310
print("8진수 -> 10진수 : ", int(b))

c = 0xc8
print("16진수 -> 10진수 : ", int(c))

[결과]
2진수 -> 10진수 : 200
8진수 -> 10진수 : 200
16진수 -> 10진수 : 200

 

마지막으로 print() 함수를 이용해서 10진수를 출력하는 것도 가능합니다. 값을 print 함수의 매개변수로 입력하면 10진수로 변환할 수 있습니다.

a = 0b11001000
print(f"2진수 -> 10진수 : {a}")

b = 0o310
print(f"8진수 -> 10진수 : {b}")

c = 0xc8
print(f"16진수 -> 10진수 : {c}")

[결과]
2진수 -> 10진수 : 200
8진수 -> 10진수 : 200
16진수 -> 10진수 : 200
반응형