天门市护送信息网

Python二进制转十进制的常见实现方法

2026-03-31 09:11:02 浏览次数:0
详细信息

1. 使用内置函数 int()

最简单直接的方法:

binary_str = "1011"
decimal = int(binary_str, 2)
print(decimal)  # 输出: 11

2. 手动计算方法

方法一:从高位到低位

def binary_to_decimal(binary_str):
    decimal = 0
    for i, digit in enumerate(binary_str):
        decimal += int(digit) * (2 ** (len(binary_str) - i - 1))
    return decimal

print(binary_to_decimal("1011"))  # 输出: 11

方法二:从低位到高位

def binary_to_decimal_v2(binary_str):
    decimal = 0
    power = 0
    # 从字符串末尾开始遍历
    for digit in reversed(binary_str):
        decimal += int(digit) * (2 ** power)
        power += 1
    return decimal

print(binary_to_decimal_v2("1011"))  # 输出: 11

3. 使用递归

def binary_to_decimal_recursive(binary_str, index=0):
    if index == len(binary_str):
        return 0
    # 当前位的值 * 2^(剩余位数-1) + 递归计算剩余部分
    return int(binary_str[index]) * (2 ** (len(binary_str) - index - 1)) + \
           binary_to_decimal_recursive(binary_str, index + 1)

print(binary_to_decimal_recursive("1011"))  # 输出: 11

4. 使用 sum() 和生成器表达式

def binary_to_decimal_sum(binary_str):
    return sum(int(digit) * (2 ** i) 
               for i, digit in enumerate(reversed(binary_str)))

print(binary_to_decimal_sum("1011"))  # 输出: 11

5. 使用位运算(更高效)

def binary_to_decimal_bitwise(binary_str):
    decimal = 0
    for digit in binary_str:
        # 左移一位并加上当前位的值
        decimal = (decimal << 1) | int(digit)
    return decimal

print(binary_to_decimal_bitwise("1011"))  # 输出: 11

6. 处理带符号的二进制数

def signed_binary_to_decimal(binary_str):
    if binary_str[0] == '-':
        # 负数:补码表示
        return -int(binary_str[1:], 2)
    elif binary_str[0] == '+':
        # 正数
        return int(binary_str[1:], 2)
    else:
        # 无符号数
        return int(binary_str, 2)

print(signed_binary_to_decimal("1011"))   # 输出: 11
print(signed_binary_to_decimal("-1011"))  # 输出: -11

7. 处理带前缀的二进制

def parse_binary_with_prefix(binary_str):
    # 处理 0b 前缀
    if binary_str.startswith('0b'):
        binary_str = binary_str[2:]
    # 处理 b 后缀
    elif binary_str.endswith('b'):
        binary_str = binary_str[:-1]
    return int(binary_str, 2)

print(parse_binary_with_prefix("0b1011"))  # 输出: 11
print(parse_binary_with_prefix("1011b"))   # 输出: 11

8. 性能比较函数

import timeit

def benchmark():
    binary_str = "1010101010101010" * 10  # 较长二进制串

    methods = {
        "内置int()": "int(binary_str, 2)",
        "位运算": """
decimal = 0
for digit in binary_str:
    decimal = (decimal << 1) | int(digit)""",
        "sum+生成器": """
sum(int(digit) * (2 ** i) for i, digit in enumerate(reversed(binary_str)))"""
    }

    for name, code in methods.items():
        time = timeit.timeit(code, setup=f"binary_str='{binary_str}'", number=10000)
        print(f"{name}: {time:.6f} 秒")

# benchmark()

实际应用示例

# 示例:读取文件中的二进制数据并转换
def convert_binary_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            binary_str = line.strip()
            if binary_str:  # 跳过空行
                decimal = int(binary_str, 2)
                print(f"二进制: {binary_str} -> 十进制: {decimal}")

# 示例:批量转换
binary_numbers = ["101", "1101", "11111", "1000000"]
decimal_numbers = [int(b, 2) for b in binary_numbers]
print(decimal_numbers)  # 输出: [5, 13, 31, 64]

建议:

日常使用:推荐使用内置函数 int(binary_str, 2),简洁高效 学习目的:可以尝试手动实现,理解转换原理 高性能需求:使用位运算版本 生产环境:优先使用内置函数,并进行输入验证
def safe_binary_to_decimal(binary_str):
    """安全转换,包含错误处理"""
    if not binary_str:
        raise ValueError("输入不能为空")

    # 验证是否为有效二进制字符串
    if not all(c in '01' for c in binary_str):
        raise ValueError(f"'{binary_str}' 不是有效的二进制字符串")

    return int(binary_str, 2)
相关推荐