当前位置: 首页 > news >正文

【unitrix数间混合计算】3.3 无符号整数标记trait(bin_unsigned.rs)

一、源码

这段代码是用 Rust 语言实现的一个类型级无符号二进制整数系统,通过类型系统在编译时表示和操作二进制数字。这是一种典型的"类型级编程"(type-level programming)技术。

use crate::number::{U0, Bin, Bit, BinInt};/// 无符号二进制整数标记
/// - 包含零和正整数
/// - 底层实现保证数值有效性
pub trait BinUnsigned: BinInt + Copy + Default + 'static{#[allow(missing_docs)] const U8: u8;#[allow(missing_docs)] const U16: u16;#[allow(missing_docs)] const U32: u32;#[allow(missing_docs)] const U64: u64;#[allow(missing_docs)] const U128: u128;#[allow(missing_docs)] const USIZE: usize;#[allow(missing_docs)] const I8: i8;#[allow(missing_docs)] const I16: i16;#[allow(missing_docs)] const I32: i32;#[allow(missing_docs)] const I64: i64;#[allow(missing_docs)] const I128: i128;#[allow(missing_docs)] const ISIZE: isize;#[allow(missing_docs)] fn to_u8() -> u8;#[allow(missing_docs)] fn to_u16() -> u16;#[allow(missing_docs)] fn to_u32() -> u32;#[allow(missing_docs)] fn to_u64() -> u64;#[allow(missing_docs)] fn to_u128() -> u128;#[allow(missing_docs)] fn to_usize() -> usize;#[allow(missing_docs)] fn to_i8() -> i8;#[allow(missing_docs)] fn to_i16() -> i16;#[allow(missing_docs)] fn to_i32() -> i32;#[allow(missing_docs)] fn to_i64() -> i64;#[allow(missing_docs)] fn to_i128() -> i128;#[allow(missing_docs)] fn to_isize() -> isize;
}// 零值实现
impl BinUnsigned for U0 {const U8: u8 = 0;const U16: u16 = 0;const U32: u32 = 0;const U64: u64 = 0;const U128: u128 = 0;const USIZE: usize = 0;const I8: i8 = 0;const I16: i16 = 0;const I32: i32 = 0;const I64: i64 = 0;const I128: i128 = 0;const ISIZE: isize = 0;#[inline] fn to_u8() -> u8 { 0 }#[inline] fn to_u16() -> u16 { 0 }#[inline] fn to_u32() -> u32 { 0 }#[inline] fn to_u64() -> u64 { 0 }#[inline] fn to_u128() -> u128 { 0 }#[inline] fn to_usize() -> usize { 0 }#[inline] fn to_i8() -> i8 { 0 }#[inline] fn to_i16() -> i16 { 0 }#[inline] fn to_i32() -> i32 { 0 }#[inline] fn to_i64() -> i64 { 0 }#[inline] fn to_i128() -> i128 { 0 }#[inline] fn to_isize() -> isize { 0 }
}// 所有正整数都是无符号数
impl<U: BinUnsigned, B: Bit> BinUnsigned for Bin<U, B>
{const U8: u8 = B::U8 | U::U8 << 1;const U16: u16 = B::U8 as u16 | U::U16 << 1;const U32: u32 = B::U8 as u32 | U::U32 << 1;const U64: u64 = B::U8 as u64 | U::U64 << 1;const U128: u128 = B::U8 as u128 | U::U128 << 1;const USIZE: usize = B::U8 as usize | U::USIZE << 1;const I8: i8 = B::U8 as i8 | U::I8 << 1;const I16: i16 = B::U8 as i16 | U::I16 << 1;const I32: i32 = B::U8 as i32 | U::I32 << 1;const I64: i64 = B::U8 as i64 | U::I64 << 1;const I128: i128 = B::U8 as i128 | U::I128 << 1;const ISIZE: isize = B::U8 as isize | U::ISIZE << 1;#[inline] fn to_u8() -> u8 { B::to_u8() | U::to_u8() << 1}#[inline] fn to_u16() -> u16 { u16::from(B::to_u8()) | U::to_u16() << 1}#[inline]fn to_u32() -> u32 {u32::from(B::to_u8()) | U::to_u32() << 1}#[inline]fn to_u64() -> u64 {u64::from(B::to_u8()) | U::to_u64() << 1}#[inline]fn to_u128() -> u128 {u128::from(B::to_u8()) | U::to_u128() << 1}#[inline]fn to_usize() -> usize {usize::from(B::to_u8()) | U::to_usize() << 1}#[inline]fn to_i8() -> i8 {B::to_u8() as i8 | U::to_i8() << 1}#[inline]fn to_i16() -> i16 {i16::from(B::to_u8()) | U::to_i16() << 1}#[inline]fn to_i32() -> i32 {i32::from(B::to_u8()) | U::to_i32() << 1}#[inline]fn to_i64() -> i64 {i64::from(B::to_u8()) | U::to_i64() << 1}#[inline]fn to_i128() -> i128 {i128::from(B::to_u8()) | U::to_i128() << 1}#[inline]fn to_isize() -> isize {B::to_u8() as isize | U::to_isize() << 1}
}

二、核心概念

  1. 基础类型
  • U0: 表示数字 0 的类型

  • Bit: 表示单个比特(0 或 1)的 trait

  • Bin<U, B>: 表示二进制数字的泛型类型,其中:

    • U 是高位部分(也是 BinUnsigned 类型)

    • B 是最低位比特(Bit 类型)

  1. BinUnsigned Trait

这是一个标记 trait,定义了无符号二进制整数需要实现的功能:


// 数字 5 的二进制表示:101
// 在类型系统中表示为:Bin<Bin<Bin<U0, B1>, B0>, B1>

三、实现细节

  1. 零的实现 (U0)
  • 所有常量都返回 0

  • 所有转换方法都返回 0

  1. 正整数的实现 (Bin<U, B>)

核心算法是二进制数的递归构造:


// 对于 Bin<U, B> 表示的数字,其值为:= (U 的值 × 2) + B 的值

具体实现:

  • U8/U16/…:编译时常量,通过位运算计算

  • to_u8()/to_u16()/…:运行时方法,同样通过位运算计算

四、技术特点

  1. 编译时计算:使用 const 常量在编译时完成数值计算

  2. 零成本抽象:运行时没有额外开销,所有信息在编译期确定

  3. 类型安全:通过类型系统保证数值的有效性

  4. 递归结构:使用递归类型定义表示任意长度的二进制数

五、使用示例


// 假设有具体的 Bit 实现 B0(0) 和 B1(1)
// 数字 5 (二进制 101) 的类型表示:
type Five = Bin<Bin<Bin<U0, B1>, B0>, B1>;assert_eq!(Five::U8, 5);
assert_eq!(Five::to_u8(), 5);

六、应用场景

这种技术常用于:

  • 嵌入式系统的类型安全配置

  • 需要编译时数值验证的场景

  • 元编程和领域特定语言(DSL)

  • 学术研究中的类型系统探索

这是一种高级的 Rust 编程技术,展示了 Rust 强大的类型系统和编译时计算能力。

七、原计划的问题

// 原计划:BinPos -> BinUnsigned (包含0和正数)
// 但出现了递归调用错误,因为:
trait BinPos: BinUnsigned + NonZero {}  // 循环依赖问题

八、现设计的优势

  1. trait 分工明确

// 现在清晰的职责划分:
trait BinUnsigned: BinInt + Copy + Default  // 所有无符号数(包含0)
trait NonZero  // 标记 trait,排除零值// 组合使用:BinUnsigned + NonZero = 正整数
  1. 避免递归依赖

// 不再需要 BinPos 继承 BinUnsigned
// 而是通过 trait 组合实现相同效果
fn process_positive<T: BinUnsigned + NonZero>(num: T) {// 这里 T 一定是正整数
}
  1. 编译检查友好

// 编译器可以更好地处理这种扁平化的 trait 层次
// 没有复杂的继承链,减少编译错误
  1. 更好的灵活性

// 可以单独使用任意 trait 组合:
fn process_any<T: BinUnsigned>(num: T)     // 接受0和正数
fn process_nonzero<T: NonZero>(num: T)     // 接受任何非零类型
fn process_positive<T: BinUnsigned + NonZero>(num: T) // 只接受正整数

九 新旧实现对比

现设计相比原始设计的改进:

方面原设计改进设计
trait 层次复杂的继承链扁平化组合
编译错误容易递归错误更少编译问题
扩展性修改困难易于扩展
代码清晰度相对复杂职责分明

实际应用示例


// 定义具体的非零标记
struct NonZeroMarker;// 为正整数类型实现 NonZero
impl<U: BinUnsigned, B: Bit> NonZero for Bin<U, B> {}// 使用示例
fn safe_division<T: BinUnsigned + NonZero, U: BinUnsigned
>(numerator: U, denominator: T) -> Result<U, DivisionByZero> {// 编译时确保分母不为零Ok(divide(numerator, denominator))
}

十、总结

目前设计决策体现了很好的工程思维:

  1. 解决实际问题:通过 trait 组合避免递归依赖

  2. 保持简洁性:去除不必要的中间 trait

  3. 增强可用性:明确的职责分离让代码更易理解

  4. 兼容性考虑:与现有 Rust 的 NonZero 概念保持一致

这种设计既解决了技术问题,又提供了更好的开发体验,是一个很优秀的重构方案。

http://www.dtcms.com/a/341259.html

相关文章:

  • C++:仿函数部分的补充、模版进阶(非类型模版参数、模板的特化、模板的分离编译)
  • 1277. 统计全为 1 的正方形子矩阵
  • 含钼溶液中回收钼
  • 【Windows】Windows平台基于加速地址安装vcpkg并集成到Visual Studio 2017
  • MySQL 50 道经典练习题及答案
  • 使用Jmeter轻松实现AES加密测试
  • 国电南自面试记录
  • 细说数仓中不同类型的维度
  • 实时交互世界模型新标杆! Skywork AI 发布 Matrix-Game 2.0: 攻克实时交互难题,在实时性与视频生成质量上实现跨越式突破!
  • synchronized锁,ReentrantLock 锁
  • 基于隐函数定理的偏导数计算及其C++实现
  • 批处理指令常见问题
  • 基于langchain重现agent调用llm和tools的过程
  • Angular入门教程
  • VG技术下,美术在资源制作时的规范
  • 前端 下载后端返回的二进制excel数据
  • Java集合框架:Set、List、Map及HashMap底层实现详解
  • 在Excel和WPS表格中制作可打印的九九乘法表
  • Flask高效数据库操作指南
  • Qt音乐播放器项目实践:本地持久化与边角问题处理
  • 对象存储 COS 端到端质量系列——终端 COS SDK 网络优化
  • 开发中使用——鸿蒙特有的图片保存到相册的方式
  • 气泡水位计在水库大坝安全监测中的应用
  • 大语言模型研究进展
  • 【MAR】OSCNet+学习笔记
  • 机器学习总复习
  • Redis知识总结
  • IDEA:控制台中文乱码
  • 【JavaEE】多线程 -- 定时器
  • 无人机感知系统详解