공부중

[논리회로] 진법 변환 ( 방법 및 python code) 본문

전자전기/논리회로

[논리회로] 진법 변환 ( 방법 및 python code)

복습 2024. 3. 30. 12:58
728x90

ㅌ2진수, 8진수, 10진수, 16진수를 원하는 진수로 변환하는 방법에 대해 학습해보자. 

정석적인 변환방법에 대해 학습하고 파이썬 코드를 사용해서 맞게 계산하였는지 검증하는 과정을 가질 것이다. 

(진법 계산기중에 소수점까지 계산해주는 사이트를 못찾았다...) 

 

코드는 다음과 같다 .

 

최종 코드 

# 진수 변환기 

def convert_fraction_to_decimal(fraction, base):
    """소수 부분을 10진수로 변환"""
    decimal = 0
    for i, digit in enumerate(fraction):
        decimal += int(digit, base) * (base ** -(i + 1))
    return decimal

def convert_decimal_to_base(decimal, base):
    """10진수 소수 부분을 다른 진법으로 변환"""
    output = ""
    while decimal and len(output) < 12:  # 최대 12자리까지 변환
        decimal *= base
        whole_part = int(decimal)
        if whole_part < 10:
            output += str(whole_part)
        else:
            output += chr(ord('A') + whole_part - 10)  # 10 이상일 때 A, B, C, ...로 변환
        decimal -= whole_part
    return output

def convert_base(number, from_base):
    """주어진 진법의 수를 2, 8, 10, 16진수로 변환"""
    integer_part, _, fraction_part = number.partition(".")
    
    # 정수 부분 변환
    integer_decimal = int(integer_part, from_base)
    
    # 소수 부분 변환 (10진수로)
    fraction_decimal = convert_fraction_to_decimal(fraction_part, from_base) if fraction_part else 0
    
    # 결과 출력
    print(f"2진수: {bin(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 2)}")
    print(f"8진수: {oct(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 8)}")
    print(f"10진수: {integer_decimal}.{str(fraction_decimal)[2:]}")
    print(f"16진수: {hex(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 16)}")


while(1):
    # 사용자 입력
    base = int(input("입력할 진수 (예: 2, 8, 10, 16): "))
    number = input(f"{base}진수 값 입력: ")

    convert_base(number, base)

 

1. 진법 변환 파이썬 코드 

 

 

(1차 코드)

아래의 코드를 사용할 경우 16진수 변환에서 소수점 이하 부분이 제대로 변환되지 않는 것을 확인하였다. 

1차 코드 문제점
16진수 확인
2차 코드  
def convert_decimal_to_base(decimal, base):
함수 코드 수정

# 진수 변환기 

def convert_fraction_to_decimal(fraction, base):
    """소수 부분을 10진수로 변환"""
    decimal = 0
    for i, digit in enumerate(fraction):
        decimal += int(digit, base) * (base ** -(i + 1))
    return decimal

def convert_decimal_to_base(decimal, base):
    """10진수 소수 부분을 다른 진법으로 변환"""
    output = ""
    while decimal and len(output) < 12:  # 최대 12자리까지 변환
        decimal *= base
        output += str(int(decimal))
        decimal -= int(decimal)
    return output

def convert_base(number, from_base):
    """주어진 진법의 수를 2, 8, 10, 16진수로 변환"""
    integer_part, _, fraction_part = number.partition(".")
    
    # 정수 부분 변환
    integer_decimal = int(integer_part, from_base)
    
    # 소수 부분 변환 (10진수로)
    fraction_decimal = convert_fraction_to_decimal(fraction_part, from_base) if fraction_part else 0
    
    # 결과 출력
    print(f"2진수: {bin(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 2)}")
    print(f"8진수: {oct(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 8)}")
    print(f"10진수: {integer_decimal}.{str(fraction_decimal)[2:]}")
    print(f"16진수: {hex(integer_decimal)[2:]}.{convert_decimal_to_base(fraction_decimal, 16)}")


while(1):
    # 사용자 입력
    base = int(input("입력할 진수 (예: 2, 8, 10, 16): "))
    number = input(f"{base}진수 값 입력: ")

    convert_base(number, base)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90