【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

六、设计特点

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

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

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

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

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

相关推荐
iDao技术魔方1 小时前
DeepSeek TUI:原生 Rust 打造的终端 AI 编码 Agent
开发语言·人工智能·rust
古城小栈1 小时前
封神!Rust 出品 HTTP 压测神器 cargo-whero,轻量碾压 JMeter、wrk,新手也能秒上手
jmeter·http·rust
kyriewen3 小时前
你的前端滤镜慢得像PPT?用Rust+WebAssembly,一秒处理4K图
前端·rust·webassembly
kyriewen113 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
techdashen7 小时前
用 Rust 写生产级服务要踩多少坑——Cloudflare 把答案做成了一个开源库
开发语言·rust·开源
数据智能老司机7 小时前
Rust 设计模式与最佳实践——不要和借用检查器对抗
rust
Rust研习社8 小时前
你为什么总是入门 Rust 失败
开发语言·后端·rust
techdashen8 小时前
等了两年,Cloudflare 终于给规则引擎加上了通配符
服务器·rust
芳草萋萋鹦鹉洲哦9 小时前
【tauri】为什么接口通信选择invoke而不是Axios
rust·axios·tauri·invoke
天天打码12 小时前
从 Rolldown 到 Oxc:前端工具链正在全面 Rust 化
开发语言·前端·rust