一、源码
- 定义
这段Rust代码实现了一个倒序存储的无符号整数系统。
rust
/// Inverted `UInt` (has most significant digit on the outside)
pub struct InvertedUInt<IU: InvertedUnsigned, B: Bit> {
msb: IU,
lsb: B,
}
- 实现
rust
/// Inverted unsigned numbers
pub trait InvertedUnsigned {
fn to_u64() -> u64;
}
impl InvertedUnsigned for InvertedUTerm {
#[inline]
fn to_u64() -> u64 {
0
}
}
impl<IU: InvertedUnsigned, B: Bit> InvertedUnsigned for InvertedUInt<IU, B> {
#[inline]
fn to_u64() -> u64 {
u64::from(B::to_u8()) | IU::to_u64() << 1
}
}
二、核心概念
这是一个倒序存储的二进制数表示系统,与传统二进制表示相反:
-
传统:1010 表示 10(最左边是最高位)
-
倒序:1010 表示 5(最左边是最低位)
三、结构定义
rust
pub struct InvertedUInt<IU: InvertedUnsigned, B: Bit> {
msb: IU, // 更高位的数字(在外部)
lsb: B, // 最低位数字
}
这个结构使用类型级编程,在编译时表示数字。
四、实现解析
- 终止类型(数字0)
rust
impl InvertedUnsigned for InvertedUTerm {
fn to_u64() -> u64 {
0 // 基础情况:表示数字0
}
}
- 递归类型(构建更大数字)
rust
impl<IU: InvertedUnsigned, B: Bit> InvertedUnsigned for InvertedUInt<IU, B> {
fn to_u64() -> u64 {
u64::from(B::to_u8()) | IU::to_u64() << 1
}
}
转换算法:
-
B::to_u8() - 获取当前位值(0或1)
-
IU::to_u64() << 1 - 递归处理更高位并左移1位
-
用|操作符组合结果
五、示例说明
假设我们要表示倒序的二进制数 10(即传统二进制 01 = 1):
rust
// 类型表示:InvertedUInt<InvertedUTerm, B1>
// 计算过程:
B::to_u8() = 1
IU::to_u64() = 0 (来自InvertedUTerm)
结果:1 | (0 << 1) = 1
再比如 101(传统二进制 101 = 5):
rust
// 类型表示:InvertedUInt<InvertedUInt<InvertedUTerm, B0>, B1>
// 计算过程:
最外层:B=1, IU=内部结果
内部:B=0, IU=0 → 0 | (0 << 1) = 0
结果:1 | (0 << 1) = 1
六、设计特点
-
编译时计算:所有转换在编译期完成
-
类型安全:通过类型系统确保数值有效性
-
递归结构:使用递归类型构建任意长度的数字
-
倒序存储:与传统二进制表示方向相反
这种设计常用于需要编译时数值计算和类型安全的场景,如嵌入式系统或高性能计算库。