2023年6月

Python 二进制转十进制

二进制转十进制的原理相对简单。
假设有二进制数为abc.def,对应的十进制数为A.B
那么整数部分A = a*2^2 + b*2^1 + c*2^0, 小数部分B = d*2^(-1) + e*2^(-2) + f*2^(-3)
实现程序如下:

# 二进制转十进制
def binary_to_decimal(binary):
    decimal = 0
    integer_part, fractional_part = binary.split('.')  # 拆分整数部分和小数部分

    # 转换整数部分为十进制
    for i in range(len(integer_part)):
        digit = int(integer_part[i])
        power = len(integer_part) - i - 1
        decimal += digit * (2 ** power)

    # 转换小数部分为十进制
    for i in range(len(fractional_part)):
        digit = int(fractional_part[i])
        power = -(i + 1)
        decimal += digit * (2 ** power)

    return decimal

Python 十进制(可包含小数)转二进制

原理

假设有十进制数A.B,对应的二进制数为abc.def
整数部分A = a*2^2 + b*2^1 + c*2^0,所以当A除以2时,得到a*2^1 + b*2^0和余数c除2取余)。
同理,小数部分B = d*2^(-1) + e*2^(-2) + f*2^(-3),当B乘以2时,B*2 - d = e*2^(-1) + f*2^(-2),即 B*2的整数部分求出了d乘2取整)。

所以十进制转换成二进制算法如下:

def decimal_to_binary(decimal):
    integer_part = int(decimal)  # 提取整数部分
    fractional_part = decimal - integer_part  # 提取小数部分

    # 转换整数部分为二进制
    binary_integer = ""
    if integer_part == 0:
        binary_integer = "0"  # 十进制数为0时,二进制为0
    else:
        while integer_part > 0:
            binary_integer = str(integer_part % 2) + binary_integer
            integer_part = integer_part // 2

    # 转换小数部分为二进制
    binary_fractional = ""
    while fractional_part > 0:
        fractional_part *= 2
        bit = int(fractional_part)
        binary_fractional += str(bit)
        fractional_part -= bit
        if len(binary_fractional) > 12:
            break  # 限制小数部分的位数为12位

    binary = binary_integer
    if binary_fractional != "":
        binary += "." + binary_fractional

    return binary