PAYATHON 2026

Rust 中如何将整数转换为二进制字符串?有 to_str_radix 吗?

数据小许

如果 b 是 Rust 的内置整数类型,可以用 format!("{:b}", b) 得到二进制字符串。内置整数没有示例中的 to_str_radix(2) 方法,二进制输出使用格式化接口。

如何转换为二进制字符串

原问题中的代码希望用参数 2 指定输出进制:

let string = b.to_str_radix(2);

要得到二进制表示,可以改成:

fn main() {
    let b = 10u32;
    let string = format!("{:b}", b);

    assert_eq!(string, "1010");
    println!("{}", string);
}

{:b} 表示使用二进制格式。format! 返回一个 String,可以保存、拼接或传给其他函数。如果只需要打印,可以直接使用 println!("{:b}", b)。

转换改变的是整数的表示形式,整数值本身不变。

如何添加前缀或补零

可以根据需要选择格式说明符:

let b = 10u32;

assert_eq!(format!("{:b}", b), "1010");
assert_eq!(format!("{:#b}", b), "0b1010");
assert_eq!(format!("{:08b}", b), "00001010");
assert_eq!(format!("{:#010b}", b), "0b00001010");

其中,# 添加 0b 前缀,0 配合宽度进行补零。宽度包含前缀,表示的是最小宽度;数值过长时不会被截断。

为什么有 from_str_radix,却没有对应的方法

from_str_radix 用于解析输入字符串,需要显式指定进制,例如:

let value = u32::from_str_radix("1010", 2).unwrap();
assert_eq!(value, 10);

整数输出则通过格式化 trait 提供。{:b} 对应 std::fmt::Binary;其他常用进制也有相应的格式说明符:

let value = 42u32;

assert_eq!(format!("{}", value), "42");
assert_eq!(format!("{:b}", value), "101010");
assert_eq!(format!("{:o}", value), "52");
assert_eq!(format!("{:x}", value), "2a");
assert_eq!(format!("{:X}", value), "2A");

解析和输出使用不同的接口,方法名不要求一一对应。至于没有提供 to_str_radix 的历史设计原因,问题中的信息不足以确定,也不能据此推断官方的设计决定。

如果需要任意进制

{:b}、{:o} 和 {:x} 分别用于固定的二进制、八进制和十六进制格式,不能将其中的格式标记替换成运行时进制参数。

如果需要三进制、三十六进制或在运行时指定进制,就需要自行实现转换,或者使用明确支持该功能的库。

备注:内容仅供参考。