一、源碼
這是一個使用 Rust 類型系統實現類型級二進制數的方案,通過泛型和嵌套結構體在編譯期表示數值。
//! 類型級二進制數表示方案
//!
//! 使用嵌套泛型結構體表示二進制數,支持整數和實數表示。
//!
//! ## 表示規則
//! - 整數部分: `B<高位, 低位>` 結構體
//! - `B<Null, O>` = 0
//! - `B<Null, I>` = -1
//! - `B<B<Null, O>, I>` = 1
//! - 實數部分: `D<整數部分, 10的冪次>`
//! - `D<Int, Exp10>` = Int × 10^Exp10use crate::sealed::Sealed;// 基本類型定義
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct Null; // 終止標記#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct O; // 比特0#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct I; // 比特1/// 二進制數結構體
/// - H: 高位部分 (B<H,L> 或 Null)
/// - L: 低位部分 (I 或 O)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct B<H, L> {pub(crate) h: H,pub(crate) l: L,
}/// 十進制科學計數法
/// - Int: 二進制整數部分
/// - Exp10: 10的冪次(二進制表示)
#[derive(Eq, PartialEq, Clone, Copy, Debug, Default)]
pub struct D<Int, Exp10>(pub Int, pub Exp10);/// 原生數值包裝類型
#[derive(Eq, PartialEq, Debug, Clone, Copy, Default)]
pub struct V<T>(pub T);// 常用類型別名
pub type False = O; // 邏輯假
pub type True = I; // 邏輯真
pub type Z0 = B<Null, O>; // 0
pub type P1 = B<Z0, I>; // 1
pub type N1 = B<Null, I>; // -1
pub type N2 = B<N1, O>; // -2
pub type B0<H> = B<H, O>; // 以0結尾的數
pub type B1<H> = B<H, I>; // 以1結尾的數// 構造方法
impl<H> B<H, O> {#[inline]pub const fn b0(h: H) -> Self {B { h, l: O }}
}impl<H> B<H, I> {#[inline]pub const fn b1(h: H) -> Self {B { h, l: I }}
}impl<H, L> B<H, L> {#[inline]pub const fn new() -> Self {Self::default()}
}impl<Int, Exp10> D<Int, Exp10> {#[inline]pub const fn new() -> Self {Self::default()}
}impl Null {#[inline]pub const fn new() -> Self {Null}
}// 密封標記實現
impl<H, L> Sealed for B<H, L> {}
impl<Int, Exp10> Sealed for D<Int, Exp10> {}
impl Sealed for Null {}
impl Sealed for O {}
impl Sealed for I {}
impl<T> Sealed for V<T> {}
二、代碼解析
- 基本設計理念
-
使用類型系統在編譯期表示數值
-
通過嵌套泛型結構體表示二進制位
-
支持整數和實數(科學計數法)表示
- 核心類型定義
基本標記類型:
struct Null; // 終止標記,表示沒有更高位
struct O; // 表示二進制位0
struct I; // 表示二進制位1
二進制數結構體 B<H, L>:
struct B<H, L> {h: H, // 高位部分l: L // 低位部分(只能是O或I)
}
表示規則:
-
B<Null, O> = 0
-
B<Null, I> = -1 (采用補碼表示)
-
B<B<Null, O>, I> = 1 (正數需要前導零)
十進制科學計數法 D<Int, Exp10>:
struct D<Int, Exp10>(Int, Exp10);
表示 Int × 10^Exp10,其中:
-
Int 是二進制整數部分
-
Exp10 是10的冪次(也用二進制表示)
- 類型別名
定義常用數字和邏輯值:
type False = O; // 邏輯假
type True = I; // 邏輯真
type Z0 = B<Null, O>; // 0
type P1 = B<Z0, I>; // 1
type N1 = B<Null, I>; // -1
type N2 = B<N1, O>; // -2
- 構造方法
提供方便的構造方式:
// 構造以0結尾的數
B::<H>::b0(h) -> B<H, O>// 構造以1結尾的數
B::<H>::b1(h) -> B<H, I>// 默認構造
B::new() -> B<H, L>
D::new() -> D<Int, Exp10>
Null::new() -> Null
- 密封特質(Sealed)
防止外部實現這些特質,保持類型安全:
impl Sealed for B<H, L> {}
impl Sealed for D<Int, Exp10> {}
// ...其他類型的Sealed實現
- 數值表示示例
-
整數:
-
0: B<Null, O>
-
1: B<B<Null, O>, I>
-
-1: B<Null, I>
-
-2: B<B<Null, I>, O>
-
-
實數:
-
-0.1: D<N1, N1> (-1 × 10^-1)
-
20.0: D<B<P1, O>, P1> (2 × 10^1)
-
- 特點
-
編譯期計算:所有數值在編譯期確定
-
類型安全:通過類型系統保證操作合法性
-
零成本抽象:運行時無額外開銷
-
可擴展性:可以添加各種運算的類型級實現
這種設計常用于需要編譯期數值計算和驗證的場景,如維度檢查、單位系統等。