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)