파이썬 자료구조와 알고리즘(미아 스타인) 책을 읽다가 도저히 이해가 안되는 코드를 만났다.
역시나 똑같이 코드를 작성해 봤는데 실행이 되지 않았다.
문제의 코드는 다른 진법의 숫자를 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 |