【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

六、设计特点

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

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

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

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

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

相关推荐
ssshooter4 小时前
Tauri 项目实践:客户端与 Web 端的授权登录实现方案
前端·后端·rust
AI智动派7 小时前
《深入 Rust Async/Await:如何实现一个带超时保护与安全沙箱的 LLM Agent 循环》
rust
范特西林2 天前
一次 to_bits() 引发的 Rust 与 C++ 底层思考
rust
冬奇Lab3 天前
一天一个开源项目(第42篇):OpenFang - 用 Rust 构建的 Agent 操作系统,16 层安全与 7 个自主 Hands
人工智能·rust·开源
量子位3 天前
Transformer论文作者重造龙虾,Rust搓出钢铁版,告别OpenClaw裸奔漏洞
rust·openai·ai编程
哈里谢顿3 天前
Rust 语言入门博客
rust
DongLi015 天前
rustlings 学习笔记 -- exercises/06_move_semantics
rust
ssshooter5 天前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
布列瑟农的星空5 天前
前端都能看懂的rust入门教程(二)——函数和闭包
前端·后端·rust
蚂蚁背大象6 天前
Rust 所有权系统是为了解决什么问题
后端·rust