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진수가 된다.
실제 진수 변환기 코드는 아래와 같다.
하지만 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가 출력되어 정상적으로 변환이 되었음을 알 수 있다.
댓글
댓글 쓰기