一、源码
这是一个使用 Rust 类型系统实现类型级(type-level)二进制数的设计。
//! 类型级二进制数表示方案(第二套方案)
//!
//! 使用嵌套泛型结构体表示二进制数,支持整数和小数表示。
use crate::sealed::Sealed;
/// 类型级二进制数结构体
///
/// # 泛型参数说明
/// - `H`: 高位部分
/// - `I` 表示高位为1
/// - `O` 表示高位为0
/// - `B<H, L>` 表示嵌套的高位
/// - `Null` 仅用于顶层结构,表示无更高位
/// - `L`: 低位部分
/// - `I` 表示低位为1
/// - `O` 表示低位为0
/// - `B<H, L>` 表示小数部分
/// - `Null` 仅用于顶层结构,表示无小数部分
///
/// # 表示规则
/// - 整数部分使用嵌套的B结构体表示
/// - 小数部分通过低位的B结构体表示
/// - 规范化表示要求嵌套的B结构体高位不能为Null
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct B<H, L>(pub H, pub L);
/// 空类型标记,用于表示无更高位或无小数部分
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct Null;
impl Null {
/// 创建新的Null实例
#[inline(always)]
pub const fn new() -> Self {
Null
}
}
impl<H: Default, L: Default> Default for B<H, L> {
fn default() -> Self {
B(Default::default(), Default::default())
}
}
impl<H, L> B<H, L> {
/// 创建新的二进制数实例
#[inline]
pub fn new(h: H, l: L) -> Self {
B(h, l)
}
}
/// 类型级比特位0(逻辑假)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct O;
impl O {
/// 创建新的O实例
#[inline(always)]
pub const fn new() -> Self {
Self
}
}
/// 类型级比特位1(逻辑真)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct I;
impl I {
/// 创建新的I实例
#[inline(always)]
pub const fn new() -> Self {
I
}
}
// 为类型实现密封标记
impl<H, L> Sealed for B<H, L> {}
impl Sealed for O {}
impl Sealed for I {}
impl Sealed for Null {}
二、源码分析
- 核心设计理念:
使用泛型结构体 B<H, L> 表示二进制数,其中 H 是高位,L 是低位
通过类型组合来表示任意长度的二进制数
支持整数和小数的表示
- 主要类型定义:
pub struct B<H, L>(pub H, pub L);
二元组结构体,H 表示高位,L 表示低位
可以嵌套使用来表示多位二进制数
- 基本位类型:
pub struct O; // 表示二进制0
pub struct I; // 表示二进制1
pub struct Null; // 表示空/无更高位
4. 类型组合示例:
+ B<I, O> 表示二进制补码 "10" (十进制-2)
+ B<B<O, I>, O> 表示二进制 "010" (十进制2)
+ B<I, B<I, Null>> 可以表示二进制 "1.1" (小数)
+ B<I, Null> 可以表示二进制 "1.0" (小数)
5. 实现细节:
+ 所有类型都实现了常见的 trait (Eq, Debug 等)以便于使用
+ 提供了 new() 构造函数
+ 实现了 Default trait
+ 使用 Sealed trait 进行封装保护
6. 规范化规则:
+ 嵌套的 B 结构体高位不能为 Null
+ Null 只用于顶层结构表示边界
7. 使用场景:
+ 类型级编程
+ 编译期计算
+ 类型安全的二进制操作
这种设计的主要优点是:
+ 完全在类型系统层面实现,无运行时开销
+ 类型安全 - 非法状态无法表示
+ 可扩展 - 可以表示任意长度的二进制数
+ 支持小数表示
典型用例可能包括:
+ 硬件寄存器映射
+ 精确数值计算
+ 协议解析
+ 类型安全的位操作
这个实现展示了 Rust 强大的类型系统和泛型能力,能够在编译期保证二进制数的正确性。