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} 分别用于固定的二进制、八进制和十六进制格式,不能将其中的格式标记替换成运行时进制参数。
如果需要三进制、三十六进制或在运行时指定进制,就需要自行实现转换,或者使用明确支持该功能的库。
备注:内容仅供参考。
