Python 진수 변환기 만들기

파이썬에는 10진수를 2진수, 8진수, 16진수로 바꿔주는 builit-in function들이 있다. (bin, oct, hex)

하지만 2, 8, 16진수 외 진수 변환기는 없기 때문에 나머지는 직접 구현해야 한다.

숫자와 알파벳을 이용하여 진수 변환기를 구현해본다.

먼저

1) N진수의 각 자리 수가 가질 수 있는 최대값은 N-1이다.

예를 들어,
2진수는 각 자리 수의 Max값은 죽었다 깨나도 1이다.
10진수의 경우에 각 자리 수의 Max값은 죽었다 깨나도 9라는 것이다.

그래서 0~Z를 (알파벳의 case 고려하지 않았을 때) 우리가 최대로 표현할 수 있는 N진수는 36진수가 된다.

실제 진수 변환기 코드는 아래와 같다.

def rebase_from10(number, base):
    digit_map = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"    if base < 2 or base > 62:
        raise ValueError("Value must be in range of 2 and 62")

    sign = -1 if number < 0 else 1    number *= sign

    digit = []
    while number > 0:
        number, modular = divmod(number, base) # number base로 나눴을 때 몫과 나머지를 구하고 몫은 을 다시 number 변수에 할당한다.        digit.insert(0, modular)   # base digit 0번째 index insert한다. (이유는 10진수를 N진법으로 변환했을 때 계산식을 찾아보시길)
    if sign -1:
        return "-" + "".join([digit_map[d] for d in digit])
        # digit_map[d] for d in digit의 의미 :        # digit_map의 인덱스(d) 10진수일 때 값이 되고, 인덱스 키에 해당하는 value(digit_map[d]) N진수일 때 그 10진수 값을 N진수로 나타냈을 때의 값이 된다.        # ex) 10(10진수일 때 값 10) = a (11이상의 진수에서 10진수의 10을 표현한 값)        # ex) 15(10진수일 때 값 15) = f (16이상의 진수에서 10진수 15를 표현한 값)    return "".join([digit_map[d] for d in digit])

print(rebase_from10(2222, 32))
print(int("25E", base=32)) # 2222가 출력되어 정상적으로 변환이 되었음을 알 수 있다.

댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용