본문 바로가기

파이썬

진법변환(feat. 파이썬 자료구조와 알고리즘)

파이썬 자료구조와 알고리즘(미아 스타인) 책을 읽다가 도저히 이해가 안되는 코드를 만났다.

역시나 똑같이 코드를 작성해 봤는데 실행이 되지 않았다.

문제의 코드는 다른 진법의 숫자를 10진수로 변환하는 아래 코드이다.

def convert(number,base) : 
    multiplier, result = 1,0
    while number > 0 :
        result += number % base * multiplier
        multiplier *= base
        number = number // base
    return result

def test():
    number, base = 1001, 2
    assert(convert(number.base)==9)
    print("테스트 통과")

그래서 위 코드 말고 진법 변환 함수를 정리하였다.


n진수 → 10진수 변환 (int 내장함수 활용)

int("n진법 문자열로 입력", n)

int 함수는 기본적으로 다른 진법인 숫자를 10진법으로 반환해 준다.

print(int('1001',2))
print(int('aa',16))
9
170

2진법, 8진법, 16진법

  • 2진법 : bin(i)
  • 8진법 : oct(i)
  • 16진법 : hex(i)
bin(10)
oct(10)
hex(10)
'0b1010'
'0o12'
'0xa'

 

10진수를 다른 진법으로 변환

10진수를 다른 진법으로 변환할때는 몫과 나머지를 이용해야 한다.

 31을 2진수로 나타내면, 사람이 계산할때는 2^5-1로 접근하는것이 가장 빠르지만, 컴퓨터의 경우는 해당 변환할 숫자를 해당 진법으로 계속 나눈 후 나머지를 반전시켜주는 것이 가장 빠르다.

1. 사람이 계산할 때

2^5 = 32

31
=>100000 - 1
=> 011111

 

2. 나눗셈 이용

31 / 2 = 15... 1
15 / 2 = 7 ... 1
7 / 2 = 3 ... 1
3 / 2 = 1 ... 1
1 / 2 = 0 ... 1

나머지를 아래에서부터 정렬한 11111(2)이 31(10)이다.

나숫셈을 아래에서부터 정렬한다는 의미는 아래와 같다.

이를 코드로 작성해보자.

def convert1(number, base):
    r_total = ''
    while n > 0:
        q, r = divmod(number, base)
        r_total += str(r)

    return r_total[::-1]

위 코드의 경우 16진법의 반환이 되지 않는 것이 확인되었다.

16진법으로 처리하려면 아래처럼 0~16까지 반환할 값을 지정해 주면 된다.

tmp = '0123456789abcdefghijklmnopqrstuvwxyz'

import string

tmp = string.digits+string.ascii_lowercase #16진수까지 가능하게 만듦

def convert(num, base) :
    q, r = divmod(num, base)
    if q == 0 :
        return tmp[r] 
    else :
        return convert(q, base) + tmp[r]

위 코드는 https://security-nanglam.tistory.com/508 블로그를 참조했습니다

'파이썬' 카테고리의 다른 글

언패킹(Unpacking)  (0) 2022.08.17
패킹(packing)  (0) 2022.08.17
복소수  (0) 2022.08.17
++, --, +=,-=,*= 그리고 a,b = b,a (swap)  (0) 2022.08.09
파이썬 클래스  (0) 2022.08.06