一、源码

这段代码是用 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.pswp.cn/bicheng/93944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93944.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93944.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基本语法总结

1.类&#xff08;Class&#xff09;在Python中类&#xff08;Class&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念。1.1.类的基本定义最简单的类class Cat:"""这是一个最简单的类"""pass #创建实例 obj Cat()包含方法的类cl…

数据结构05(Java)-- ( 归并排序实质,归并排序扩展问题:小和问题)

前言 本文为本小白&#x1f92f;学习数据结构的笔记&#xff0c;将以算法题为导向&#xff0c;向大家更清晰的介绍数据结构相关知识&#xff08;算法题都出自&#x1f64c;B站马士兵教育——左老师的课程&#xff0c;讲的很好&#xff0c;对于想入门刷题的人很有帮助&#x1f4…

税务专业人员能力构建与发展路径指南

CDA数据分析师证书含金量高&#xff0c;适应了未来数字化经济和AI发展趋势&#xff0c;难度不高&#xff0c;行业认可度高&#xff0c;对于找工作很有帮助。一、税务专业人员的核心能力框架能力维度关键技能要素专业工具与方法论实践输出成果税务法规应用税种政策解读、法规更新…

Linux中rsync使用与inotify实时同步配置指南

Linux中rsync使用与inotify实时同步配置指南 一、rsync 简介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系统下的一款高效数据镜像和备份工具&#xff0c;用于在本地或远程同步文件和目录。 支持本地复制、基于 SSH 的远程同步&#xff0c;以及使用自有 rsync 协议的同…

Unicode 字符串转 UTF-8 编码算法剖析

&#x1f4ca; Unicode 字符串转 UTF-8 编码算法剖析 ——从 C# char 到 C wchar_t 的编码转换原理 引用&#xff1a;UTF-8 编解码可视化分析 &#x1f50d; 1. 算法功能概述 该函数将 Unicode 字符串&#xff08;C# string&#xff09;转换为 UTF-8 编码的字节数组&#xf…

php的安全性到底怎么样

PHP作为一种流行的服务器端脚本语言&#xff0c;被广泛应用于Web开发。然而&#xff0c;由于PHP是一种较为灵活的语言&#xff0c;其安全性议题一直备受争议。在这篇文章中&#xff0c;我将从多个方面来讨论PHP的安全性&#xff0c;包括常见的安全漏洞、防范措施以及最佳实践。…

mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox loadObj加载模型 二、🍀…

SSM从入门到实战:1.6 Spring数据访问与JDBC模板

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; 06-Spring数据访问与JDBC模板 &#x1f4d6; 本文概述 本文是SSM框架系列Spri…

下一代IT服务管理:ITIL5会是什么样?

ITIL4发布到现在也就5年多时间&#xff0c;按照以往的更新节奏&#xff0c;ITIL5最早也得2027年之后。但现在IT发展的速度&#xff0c;跟以前完全不是一个量级。AI都快把我们的饭碗抢了&#xff08;开个玩笑&#xff09;&#xff0c;ITIL要是还按部就班&#xff0c;估计真要被时…

最新研究进展:2023-2025年神经机器翻译突破性成果

文章目录 一、模型架构创新 1.1 混合架构的崛起 1.2 多模态翻译的突破 1.3 大语言模型与NMT的深度融合(2023-2024) 1.4 非自回归翻译(NAT)的效率革命(2024) 二、数据与训练策略优化 2.1 低资源语言翻译的飞跃 2.2 动态数据增强技术 三、效率与部署 3.1 模型压缩与加速 3.…

OpenTelemetry WebSocket 监控终极方案:打通最后一公里

概述 OpenTelemetry&#xff0c;以下简称 OTEL&#xff0c;是由 CNCF 托管的“一站式可观测性标准”&#xff0c;把指标、链路、日志三大信号统一为单一 SDK/API&#xff0c;零侵入地采集从浏览器、移动端到后端、容器、云服务的全栈遥测数据&#xff0c;并支持 40 后端一键导…

VS Code 出现的 Web 视图加载错误和服务工作者注册失败问题解决方案

针对 VS Code 或 Cursor &#xff08;vscode系&#xff09;中出现的 Web 视图加载错误和服务工作者注册失败问题&#xff0c;以下是永久性解决方案的完整操作指南&#xff1a;解决方案步骤打开命令面板 使用快捷键 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShift…

【qml-4】qml与c++交互(类型多例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库

随着 Web3 生态的不断演进&#xff0c;链上风险呈现出团伙化、隐蔽化和动态化的趋势&#xff0c;传统的单点风控手段已难以应对复杂多变的攻击模式。尤其在批量注册薅羊毛与链上交易盗转洗钱等高频风险场景中&#xff0c;攻击者往往通过伪造身份、跨链操作、多层嵌套转账等方式…

恒流源电路学习

恒流源的设计原理&#xff1a; 如图所示你可以看到右边的的推到公式得到红点处的电压是一个和左边相关的定值&#xff0c;所以呢右边的电流就是电压除以那个4Ω&#xff0c;所以得到右边的电路的电流大体是一个定值&#xff0c;不管你再加什么东西都可以保持这个电流&#xff…

基于生成对抗网络的模糊图像恢复原理与技术实现

1. 引言图像模糊是数字图像处理中的常见问题&#xff0c;其成因包括相机抖动、物体运动、聚焦不良等。传统方法如维纳滤波、Lucy-Richardson 算法等依赖于模糊核估计和逆滤波&#xff0c;在复杂场景下性能有限。生成对抗网络&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 变更修复

FE 恢复 异常日志 查看 fe.out 会有以下报错&#xff0c;此时 fe 进程是无法启动的&#xff0c;操作前注意备份所有 fe 的元数据并停止上游读写动作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系统应用收不到开机广播

安卓14系统应用收不到开机广播 - Wesley’s Blog 前段时间有测试反馈在安卓14 上面某系统应用恢复出厂设置后没有自启动&#xff0c;究竟是什么原因呢&#xff1f; 回顾 Android 从3.1开始&#xff0c;会将新安装并且从未被启动的应用置为“STOPPED”状态&#xff0c;或者被…

C# Attribute 方法扩展

场景 刚写完一个干净利落的方法&#xff0c;比如保存数据到数据库&#xff0c;逻辑清晰、结构优雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完数据&#xff0c;记得给客户发个邮件哦~” 第三天&#xff0c;“能不能再发个消息通知其他系统&#xff1f;” 第四天&am…

【URP】[法线贴图]为什么主要是蓝色的?

【从UnityURP开始探索游戏渲染】专栏-直达 法线贴图呈现蓝紫色调&#xff08;尤其以蓝色为主&#xff09;是由其‌存储原理、切线空间坐标系设计及颜色编码规则共同决定的‌。 核心原因&#xff1a;法线向量的存储规则‌ ‌法线向量的物理范围‌ 法线是单位向量&#xff0c;…