【typenum】 23 倒序存储的无符号整数(private.rs片段)

一、源码

  1. 定义
    这段Rust代码实现了一个倒序存储的无符号整数系统。
rust 复制代码
/// Inverted `UInt` (has most significant digit on the outside)
pub struct InvertedUInt<IU: InvertedUnsigned, B: Bit> {
    msb: IU,
    lsb: B,
}
  1. 实现
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,   // 最低位数字
}

这个结构使用类型级编程,在编译时表示数字。

四、实现解析

  1. 终止类型(数字0)
rust 复制代码
impl InvertedUnsigned for InvertedUTerm {
    fn to_u64() -> u64 {
        0  // 基础情况:表示数字0
    }
}
  1. 递归类型(构建更大数字)
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

六、设计特点

  • 编译时计算:所有转换在编译期完成

  • 类型安全:通过类型系统确保数值有效性

  • 递归结构:使用递归类型构建任意长度的数字

  • 倒序存储:与传统二进制表示方向相反

这种设计常用于需要编译时数值计算和类型安全的场景,如嵌入式系统或高性能计算库。

相关推荐
Rust研习社6 小时前
关于 Rust Option 的那些事:从基础到常用 API 全解析
rust
爱分享的阿Q9 小时前
Rust加WebAssembly前端性能革命实践指南
前端·rust·wasm
沉淀粉条形变量16 小时前
rust 单例模式
开发语言·单例模式·rust
skilllite作者17 小时前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
Rust研习社17 小时前
深入理解 Rust 闭包:从基础语法到实战应用
rust
Rust研习社18 小时前
Rust 时间处理神器:chrono 从入门到实战
rust
Rust研习社18 小时前
Rust 异步 ORM 新选择:Toasty 初探
rust
星辰徐哥19 小时前
异步定时任务系统的设计与Rust实战集成
开发语言·后端·rust
swear0119 小时前
【VSCODE 插件 rust-analyzer 使用】打开文件夹
ide·vscode·rust
laomocoder20 小时前
AI网关设计
人工智能·rust·系统架构