【typenum】 23 倒序存储的无符号整数(private.rs片段)
一、源码
- 定义
这段Rust代码实现了一个倒序存储的无符号整数系统。
/// Inverted `UInt` (has most significant digit on the outside)
pub struct InvertedUInt<IU: InvertedUnsigned, B: Bit> {msb: IU,lsb: B,
}
- 实现
/// 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(最左边是最低位)
三、结构定义
pub struct InvertedUInt<IU: InvertedUnsigned, B: Bit> {msb: IU, // 更高位的数字(在外部)lsb: B, // 最低位数字
}
这个结构使用类型级编程,在编译时表示数字。
四、实现解析
- 终止类型(数字0)
impl InvertedUnsigned for InvertedUTerm {fn to_u64() -> u64 {0 // 基础情况:表示数字0}
}
- 递归类型(构建更大数字)
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):
// 类型表示:InvertedUInt<InvertedUTerm, B1>
// 计算过程:
B::to_u8() = 1
IU::to_u64() = 0 (来自InvertedUTerm)
结果:1 | (0 << 1) = 1
再比如 101(传统二进制 101 = 5):
// 类型表示:InvertedUInt<InvertedUInt<InvertedUTerm, B0>, B1>
// 计算过程:
最外层:B=1, IU=内部结果
内部:B=0, IU=0 → 0 | (0 << 1) = 0
结果:1 | (0 << 1) = 1
六、设计特点
-
编译时计算:所有转换在编译期完成
-
类型安全:通过类型系统确保数值有效性
-
递归结构:使用递归类型构建任意长度的数字
-
倒序存储:与传统二进制表示方向相反
这种设计常用于需要编译时数值计算和类型安全的场景,如嵌入式系统或高性能计算库。