ZetCode

Python bin 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 bin 函数,该函数将整数转换为其二进制字符串表示形式。我们将介绍基本用法、格式化选项以及在计算中的实际应用。

基本定义

bin 函数将一个整数转换为以 "0b" 为前缀的二进制字符串。结果是一个有效的 Python 表达式,可以评估回原始数字。

主要特点:接受整数(正数或负数),返回一个字符串,并且始终包含 "0b" 前缀。对于非整数,它会引发 TypeError。

基本整数转换

以下是不同整数的简单用法,展示了 bin 如何处理正数、负数和零值。

basic_bin.py
# Positive integers
print(bin(5))     # 0b101
print(bin(10))    # 0b1010

# Negative integers
print(bin(-5))    # -0b101
print(bin(-10))   # -0b1010

# Zero
print(bin(0))     # 0b0

此示例显示了具有不同整数值的 bin。正数带有 "0b" 前缀,而负数带有 "-0b"。零转换为 "0b0"。

二进制表示形式显示了数字的 2 进制形式。请注意,负数用减号表示,而不是补码。

使用不同的进制

此示例演示了如何使用 bininthex 在二进制、十进制和十六进制表示形式之间进行转换。

base_conversion.py
number = 42

# Convert to binary
binary = bin(number)
print(binary)  # 0b101010

# Convert back to decimal
decimal = int(binary, 2)
print(decimal) # 42

# Compare with hexadecimal
print(hex(number)) # 0x2a

该示例显示了十进制和二进制之间的完整转换周期。当给定基数 2 时,int 函数可以解析二进制字符串。

这演示了 Python 一致的进制转换函数:bin 用于二进制,hex 用于十六进制,int 用于解析。

自定义 __index__ 方法

您可以通过实现 __index__ 特殊方法使自定义对象与 bin 一起使用。此示例创建一个自定义数字。

custom_bin.py
class CustomNumber:
    def __init__(self, value):
        self.value = value
    
    def __index__(self):
        return self.value
    
    def __repr__(self):
        return f"CustomNumber({self.value})"

num = CustomNumber(15)
print(bin(num))  # 0b1111

CustomNumber 类实现 __index__ 以返回其值。当我们在一个实例上调用 bin 时,Python 使用此方法。

这种模式对于应该支持二进制表示形式同时保持其自身内部状态的自定义数字类型很有用。

错误处理

当与非整数类型一起使用时,bin 函数会引发 TypeError。此示例显示了正确的错误处理。

errors.py
try:
    print(bin(3.14))
except TypeError as e:
    print(f"Error: {e}")  # 'float' object cannot be interpreted as an integer

class NoIndex:
    pass

try:
    print(bin(NoIndex()))
except TypeError as e:
    print(f"Error: {e}")  # 'NoIndex' object cannot be interpreted as an integer

这些示例演示了 bin 在不支持的类型上的行为。没有 __index__ 的浮点数和对象会引发 TypeError

要使类与 bin 一起使用,请如上一个示例所示实现 __index__

二进制字符串操作

此示例显示了二进制表示形式的实际字符串操作,包括剥离前缀和用零填充。

string_manipulation.py
number = 42

# Get binary without prefix
binary_str = bin(number)[2:]
print(binary_str)  # '101010'

# Pad with leading zeros
padded = binary_str.zfill(8)
print(padded)      # '00101010'

# Count set bits (1s)
bit_count = binary_str.count('1')
print(bit_count)   # 3

这演示了二进制字符串上的常见操作。我们删除 "0b" 前缀,用零填充以进行固定宽度显示,并计算设置的位数。

这些技术对于位操作、硬件接口和二进制表示很重要的低级编程任务非常有用。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程