파이썬 진수 변환 정리

mauz·2022년 7월 3일
0

TIL - Today I Learned

목록 보기
9/10
post-custom-banner

10진수 -> n진수

1. 내장함수 bin(), oct(), hex()

10진수 정수 -> 2진수, 8진수, 16진수 로 바꾸는 기본적인 방법은
bin, oct, hex 함수를 사용하는 것이다.

각각
binary, octal, hexadecimal의 약자이다. (참고로 10진수는 decimal이다.)

print( bin(10) )
print( oct(10) )
print( hex(10) )


출력
'0b1010'
'0o12'
'0xa'

각 함수는 10진수를 변환하여 문자열을 리턴한다.
문자열의 [:2] 는 각 진수로 변환된 결과이며,
문자열의 [2:] 는 0a, 0o, 0x 로, 뒤 숫자가 몇 진수인지를 알려준다.

따라서 변환한 값을 사용하기 위해서 앞에 두자리는 잘라내고 사용해야할 수 있다.

그러나 내장함수로는 2진수, 8진수, 16진수에 대해서만 변환을 할 수 있다.

문제에서 3진수 같은걸 요구하면 다른 방법이 필요하다.

2. 직접 함수 정의하기

def nbase1(n, k):
    ans = ''
    while k:
        ans += str(k % n)
        k //= n
    return ans[::-1]
   
   
print(nbase1(2,10))
print(nbase1(3,10))
print(nbase1(11,10))

출력
'1010'
'101'
'01'

위 nbase1 함수를 통해 10진수 k를 n으로 계속 나누면서 나머지를 통해 n진수 변환 결과를 얻을 수 있다.

그러나 n이 10을 초과하면 오류가 발생한다.
(첫째자리에 10이 오는 경우, 10은 두자릿수이므로 표현하기 이상해진다..)

따라서 16진법처럼 10 이상을 한자리의 알파벳으로 치환해주면 오류를 해결할 수 있다.

def nbase2(n, k):
    ans = ''
    while k:
        if k % n > 9:
            ans += chr(55 + k % n)
        else:
            ans += str(k % n)
        k //= n
    return ans[::-1]


print(nbase2(16,10))
print(nbase2(20,20))
print(nbase2(36,35))
print(nbase2(37,36))

출력
'A'
'10'
'Z'
'['

nbase1 함수를 수정하여 위처럼 10 이상의 수를 알파벳으로 나타낼 수 있다.
그러나 n이 36을 초과하면 Z를 넘어서, 다른 문자를 표시하기 시작한다.

def nbase3(n, k):
    if n > 36:
        return 'n진수가 알파벳으로 표현할 수 있는 범위를 넘었습니다. (n > 36)'

    ans = ''
    while k:
        if k % n > 9:
            ans += chr(55 + k % n)
        else:
            ans += str(k % n)
        k //= n


print(nbase2(37,36))

출력
'n진수가 알파벳으로 표현할 수 있는 범위를 넘었습니다. (n > 36)'

조건문을 추가하여 36진수 이상은 변환하지 않도록 막을 수 있다.


n진수 -> 10진수

int() 함수를 통해서 n진수를 10진수 정수로 쉽게 변환할 수 있다.

print( int('1010', base=2) )
print( int('1010', 2) )


출력
10
10

int()에 첫번째 인자에 문자열 형태의 n진수를,
두번째 인자에 n진수가 몇 진법인지를 정수 형태로 쓰면 된다.

print( int('0b1010', 2) )


출력
10

'1010'이 2진수임을 알려주는 문자 '0b' 가 포함 되어있어도 값을 구해준다.
물론 '0o', '0x' 도 포함 가능.

print( int('11111',37) )

출력
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#ValueError: int() base must be >= 2 and <= 36, or 0

변환시키려는 수가 2 이상 36진법 이하의 진수가 아니면 에러를 뱉어낸다.


후기

진수변환 유형 문제가 자주 보이길래 언젠가 정리해야겠다 생각만하다가
이번에 정리해보면서 진수 변환을 익힐 수 있었다.

이론 부분은 나중에 더 추가해야겠다.

profile
쥐구멍에 볕드는 날
post-custom-banner

0개의 댓글