본문 바로가기
코딩 연습/코딩배우기

[python] 파이썬의 진수 변환(2진수, 8진수, 10진수, 16진수)

by good4me 2020. 9. 18.

goodthings4me.tistory.com

 

■ 파이썬에서 10진수를 다른 진수의 문자열로 변환할 경우, 파이썬의 내장 함수 bin(), oct(), hex()를 사용하며, 역으로, 다른 진수의 문자열을 10진수 숫자형으로 변환할 때는 int()를 사용한다.

print(bin(10)) # 0b1010
print(oct(10)) # 0o12
print(hex(10)) # 0xa

print(int('0b1010', 2)) # 10
print(int('0o12', 8)) # 10
print(int('0xa', 16)) # 10

 

■ format() 내장 함수를 이용하는 방법(접두어 포함 여부를 선택할 수 있음)

# 진수(2/8/10/16) 관련 함수 사용

for i in range(16):
    print('(10진수:{0:2d}) (2진수:{1:>6s}) (8진수:{2:>4s}) (16진수:{3:>4s})'\
          .format(i, bin(i), oct(i), hex(i)))

[실행 결과]
(10진수: 0) (2진수:   0b0) (8진수: 0o0) (16진수: 0x0)
(10진수: 1) (2진수:   0b1) (8진수: 0o1) (16진수: 0x1)
(10진수: 2) (2진수:  0b10) (8진수: 0o2) (16진수: 0x2)
(10진수: 3) (2진수:  0b11) (8진수: 0o3) (16진수: 0x3)
(10진수: 4) (2진수: 0b100) (8진수: 0o4) (16진수: 0x4)
(10진수: 5) (2진수: 0b101) (8진수: 0o5) (16진수: 0x5)
(10진수: 6) (2진수: 0b110) (8진수: 0o6) (16진수: 0x6)
(10진수: 7) (2진수: 0b111) (8진수: 0o7) (16진수: 0x7)
(10진수: 8) (2진수:0b1000) (8진수:0o10) (16진수: 0x8)
(10진수: 9) (2진수:0b1001) (8진수:0o11) (16진수: 0x9)
(10진수:10) (2진수:0b1010) (8진수:0o12) (16진수: 0xa)
(10진수:11) (2진수:0b1011) (8진수:0o13) (16진수: 0xb)
(10진수:12) (2진수:0b1100) (8진수:0o14) (16진수: 0xc)
(10진수:13) (2진수:0b1101) (8진수:0o15) (16진수: 0xd)
(10진수:14) (2진수:0b1110) (8진수:0o16) (16진수: 0xe)
(10진수:15) (2진수:0b1111) (8진수:0o17) (16진수: 0xf)



# 0b, 0o, 0x 포함

for i in range(16):
    print('{0:>#6b}, {1:>#4o}, {2:>#2d}, {3:>#4x}'.format(i, i ,i, i))

[실행 결과]
   0b0,  0o0,  0,  0x0
   0b1,  0o1,  1,  0x1
  0b10,  0o2,  2,  0x2
  0b11,  0o3,  3,  0x3
 0b100,  0o4,  4,  0x4
 0b101,  0o5,  5,  0x5
 0b110,  0o6,  6,  0x6
 0b111,  0o7,  7,  0x7
0b1000, 0o10,  8,  0x8
0b1001, 0o11,  9,  0x9
0b1010, 0o12, 10,  0xa
0b1011, 0o13, 11,  0xb
0b1100, 0o14, 12,  0xc
0b1101, 0o15, 13,  0xd
0b1110, 0o16, 14,  0xe
0b1111, 0o17, 15,  0xf



# '#' 제외 시, 0b/ 0o/ 0x 제외됨

for i in range(16):
    print('{0:>6b}, {1:>4o}, {2:>2d}, {3:>4x}'.format(i, i ,i, i))
    
[실행 결과]
     0,    0,  0,    0
     1,    1,  1,    1
    10,    2,  2,    2
    11,    3,  3,    3
   100,    4,  4,    4
   101,    5,  5,    5
   110,    6,  6,    6
   111,    7,  7,    7
  1000,   10,  8,    8
  1001,   11,  9,    9
  1010,   12, 10,    a
  1011,   13, 11,    b
  1100,   14, 12,    c
  1101,   15, 13,    d
  1110,   16, 14,    e
  1111,   17, 15,    f
  

 

good4me.co.kr

 

■ 2/8/10/16진수 중 하나의 값을 입력하면, 입력값의 2/8/10/16진수 전체를 알려주는 함수 작성

def notation():
    while True:
        sel_n = input('구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> ')
        if sel_n == '0':
            print('프로그램 종료!!')
            break
        
        elif sel_n == '2' or sel_n == '8' or sel_n == '10' or sel_n == '16' :
            val = input('선택한 진수의 값 입력>> ')
            sl = val[:2]
            try:
                if sl == '0b' or sl == '0o' or sl == '0x':
                    if sl == '0b':
                        int_num = int(val, 2)
                    elif sl == '0o':
                        int_num = int(val, 8)
                    elif sl == '0x':
                        int_num = int(val, 16)
                else:
                    if sel_n == '2':
                        int_num = int('0b' + val, 2)
                    elif sel_n == '8':
                        int_num = int('0o' + val, 8)
                    elif sel_n == '10':
                        int_num = int(val)
                    elif sel_n == '16':
                        int_num = int('0x' + val, 16)
            except Exception as e:
                print(e)
                print('잘못 된 값을 입력하셨습니다.')
                continue
                    
            print(' 2진수 : {0} [{1:b}]'.format(bin(int_num), int_num)) # 0b111 #b
            print(' 8진수 : {0} [{1:o}]'.format(oct(int_num), int_num)) # 0o7 #o
            print('10진수 : {0}'.format(int_num))
            print('16진수 : {0} [{1:x}]'.format(hex(int_num), int_num)) # 0x7 #x            
        else:
            print('선택 오류!! (다시 입력하세요.)')
        
notation()



[실행 결과]

구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> 16

선택한 진수의 값 입력>> FFA1
 2진수 : 0b1111111110100001 [1111111110100001]
 8진수 : 0o177641 [177641]
10진수 : 65441
16진수 : 0xffa1 [ffa1]

구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> 10

선택한 진수의 값 입력>> 128
 2진수 : 0b10000000 [10000000]
 8진수 : 0o200 [200]
10진수 : 128
16진수 : 0x80 [80]

구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> 8

선택한 진수의 값 입력>> 123
 2진수 : 0b1010011 [1010011]
 8진수 : 0o123 [123]
10진수 : 83
16진수 : 0x53 [53]

구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> 2

선택한 진수의 값 입력>> 11011101
 2진수 : 0b11011101 [11011101]
 8진수 : 0o335 [335]
10진수 : 221
16진수 : 0xdd [dd]

구하고자 하는 진수 숫자(2/8/10/16) 입력은? (종료는 0)>> 0
프로그램 종료!!

 

 

댓글