【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

六、设计特点

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

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

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

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

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

相关推荐
superman超哥3 小时前
Rust 异步时间管理核心:Tokio 定时器实现机制深度剖析
开发语言·rust·编程语言·rust异步时间管理核心·tokio定时器实现机制·tokio定时器
古城小栈3 小时前
Rust 的 validator 库
开发语言·后端·rust
古城小栈3 小时前
Rust 的 redis-rs 库
开发语言·redis·rust
superman超哥4 小时前
Rust 异步递归的解决方案
开发语言·后端·rust·编程语言·rust异步递归
Mr -老鬼5 小时前
Rust 的优雅和其他语言的不同之处
java·开发语言·rust
weixin_531651815 小时前
Rust 的所有权机制
java·开发语言·rust
古城小栈7 小时前
Rust 丰富&好用的 格式化语法
前端·算法·rust
古城小栈9 小时前
Tokio:Rust 异步界的 “霸主”
开发语言·后端·rust
superman超哥10 小时前
Rust 异步并发核心:tokio::spawn 与任务派发机制深度解析
开发语言·rust·编程语言·rust异步并发核心·rust任务派发机制
木木木一10 小时前
Rust学习记录--C9 错误处理
前端·学习·rust