[Python] 진수 변환 - 2진법 표현, 10진법 표현, 진수에서 진수 변환, 아스키 코드

2023. 10. 23. 21:33파이썬(Python)

반응형

1. 2진법으로 표현하기

- 숫자를 2로 나누어 몫과 나머지를 구한다.

- 몫을 계속 2로 나누고 몫이 1일 때 1부터 지금까지 구한 나머지를 거꾸로 순서대로 적는다.

 

- 예를 들어, 50의 2진법을 구한다면 다음과 같다.

- 따라서 50을 2진법으로 표현하면 110010이 된다.

 

- 코드로 표현하면 다음과 같다.

n = int(input())
binary = []

while n >= 2:
    binary.append(n % 2)
    n //= 2

binary.append(n)

print(''.join(map(str, binary[::-1])))

 

>> 50
110010

 

- n을 2로 계속 나누어 나머지를 binary 리스트에 저장한다.

- n을 2로 나눈 몫으로 갱신하고 n이 1이 될 때까지 반복한다.

- n=1이 되면 n을 binary에 저장한다.

- 역순으로 출력해야 하므로 리스트를 뒤집는다.

- 리스트의 원소를 합치므로 join을 사용한다.

- 단, join은 원소가 문자열 형태여야 하므로 map을 사용하여 int인 원소를 str로 바꾼다.

 

 

2. 10진법으로 표현하기

- 만약 2진법 110010을 10진법으로 표기한다면 어떻게 해야 할까?

- 10진법에서 2진법을 구할 때는 계속 2로 나누었다.

- 2진법에서 10진법은 이를 반대로 2를 곱하고 2진법의 각 index의 값을 더하여 구할 수 있다.

 

- 이를 코드로 작성하면 다음과 같다.

n = list(map(int, list(input())))
num = 0

for i in n:
    num = num*2+i
print(num)

 

>> 110010
50

 

- 입력한 2진수인 n을 원소가 1개인 리스트로 표현한다.

- 초기 10진수를 0으로 설정한다.

- 리스트를 순회하며 10진수에 2를 곱해 각 자리의 2진수를 더하여 10진수를 갱신한다.

 

 

Q) 정수를 n진법으로 변환

- 변환할 정수 m과 진법 n을 입력한다.

- n진법을 출력한다.

 

num, n = map(int, input().split())

arr = []

while num >= n:
    arr.append(num % n)
    num //= n
arr.append(num)

print(''.join(map(str, arr[::-1])))

 

>> 100 7
202

 

- num을 n으로 계속 나누어 나머지arr 리스트에 저장한다.

- num은 n으로 나눈 몫으로 갱신하고 num이 n보다 작으면 반복문을 탈출하고 num을 리스트에 저장한다.

- 역순으로 배열하여 리스트 내의 원소를 합친다.

 

 

Q) a진수에서 b진수로 변환

- a진수인 n을 b진수로 변환을 하자.

- 예를 들어, 123 5 7이라고 입력을 하면 5진법인 123을 7진법으로 변경하라는 의미이다.

 

n, a, b = map(int, input().split())
arr = list(map(int, list(str(n))))
num = 0
for i in arr:
    num = num*a+i

arr2 = []

while num >= b:
    arr2.append(num % b)
    num //= b
arr2.append(num)
print(''.join(map(str, arr2[::-1])))

 

>> 123 5 7
53

 

- a진법인 n을 10진법으로 변경 후 b진법으로 변환한다.

- n의 각 숫자를 리스트로 나타낸다. (arr)

- 반복문을 통해 10진법으로 표현할 num에 a를 곱하고 arr의 각 원소를 더한다.

- 10진법인 num을 다시 b진법으로 변환하여 답을 구한다.

 

 

Q) 진법 변환 확장하기

- 예를 들어 16진법인 AB는 10진법으로 변환하면 171(16*10+11 )이 된다.

- A는 10을 의미하고 11진법부터 사용한다. 또한 B는 11을 의미하고 12진법부터 사용한다.

- 입력은 'a진수에서 b진수로 변환' 문제와 동일하다.

 

def isError(a, n):
    for i in n:
        if not i.isdigit() and ord(i)-ord('A')+10 >= a:
            return False
    return True


def number_append(x):
    if x >= 10:
        arr.append(chr(x+ord('A')-10))
    else:
        arr.append(str(x))


while True:
    n, a, b = input().split()
    a, b = int(a), int(b)

    if isError(a, n):
        arr = []

        num = 0
        for i in list(n):
            if i.isdigit():
                num = num*a+int(i)
            else:
                num = num*a+ord(i)-ord('A')+10

        print(num)
        while num >= b:
            number_append(num % b)
            num //= b
        number_append(num)

        print(''.join(arr[::-1]))
        break

    else:
        print('input Error')

 

>> AB 16 8
253
>> CG 16 8
input Error
>> CF 16 8
207
317

 

- 입력 n, a, b는 a진수인 n을 b진수로 변환하는 것을 의미한다.

- a, b는 정수형으로 변환한다.

 

- isError 함수는 입력이 바르게 되었는지 확인하기 위한 함수이다.

- 예를 들어, 16진법은 0~9, A~F까지 16 종류의 수와 문자를 사용할 수 있다.

- 만약 CG라면 G는 16을 의미하고 범위 밖의 수이므로 input Error 메시지를 출력하고 다시 입력하게 한다.

- 현재 문자열 형태인 n을 순회하며 문자 1개의 아스키코드를 구한다. (ord(i))

- 문자열을 값으로 정의하기 위해 ord(i)-ord('A')+10을 정했고 이 값이 현재 진법 a 이상이면 False를 반환한다.

- 예를 들어, 문자열 D면 A에서 D까지 3칸이므로 13이 되고 14진법 이상에서 사용할 수 있다.

- 따라서 a가 13진법 이하면 사용할 수 없다.

 

- 10진법으로 변환하는 과정에서 반복문의 순회를 통해 각 원소가 숫자이면 a를 곱해 각 원소를 더한다.

- 만약 원소가 문자열이면 a를 곱해 원소의 아스키코드를 구해 A의 아스키코드를 빼서 10을 더한다.

 

- 이를 b진법으로 변환하기 위해 number_append 함수를 정의한다.

- number_append는 10진법인 num을 b로 나눠 나머지를 배열에 저장하는 함수이다.

- 만약 나머지가 10 이상이면 나머지에 10을 빼서 A의 아스키코드를 더한 값의 아스키코드를 구한다.

- chr을 이용해 문자열로 변환 후 배열에 저장한다.

 

- join을 이용해 배열 내의 원소를 합쳐 답을 구한다.