【unitrix】 6.8 加一运算(add_one.rs)

一、源码

这是一个使用 Rust 类型系统实现二进制数加一操作的代码。

use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 类型级加一操作 trait
/// 
/// 为二进制数类型实现加一操作,返回新的类型
pub trait AddOne {/// 加一操作的结果类型type Output;/// 执行加一操作fn add_one(self) -> Self::Output;
}// 基础类型实现 - 处理最简单的情况
impl AddOne for B<Null, O> {type Output = B<B<Null, O>, I>;  // 0 + 1 = 1#[inline]fn add_one(self) -> Self::Output {B::new()}
}impl AddOne for B<Null, I> {type Output = B<Null, O>;  // -1 + 1 = 0#[inline]fn add_one(self) -> Self::Output {B::new()}
}// 递归实现 - 处理通用二进制数
impl<H, L> AddOne for B<B<H, L>, O>
whereB<H, L>: NormalizeIf<I>,  // 格式检查
{type Output = <B<H, L> as NormalizeIf<I>>::Output;#[inline]fn add_one(self) -> Self::Output {self.h.normalize(I)  // 0 + 1 = 1,无进位,如果高位是N1时忽略I}
}impl<H, L> AddOne for B<B<H, L>, I>
whereB<H, L>: AddOne,  // 高位部分需要能加一<B<H, L> as AddOne>::Output: NormalizeIf<O>,  // 有进位,如果高位是Z0时忽略O
{type Output = <<B<H, L> as AddOne>::Output as NormalizeIf<O>>::Output;#[inline]fn add_one(self) -> Self::Output {self.h.add_one().normalize(O)  // 1 + 1 = 0 并进位}
}

二、代码分析

  1. 核心概念
  • 类型级编程:在编译期通过类型系统完成计算

  • 二进制表示:使用嵌套的 B<H, L> 结构表示二进制数

    • H 是高位部分

    • L 是最低位(O=0 或 I=1)

  • 加一操作:实现二进制数的递增运算

  1. 基础实现(简单情况)
    对 0 加一:

impl AddOne for B<Null, O> {  // 0type Output = B<B<Null, O>, I>;  // 0 + 1 = 1fn add_one(self) -> Self::Output {B::new()  // 创建 B<B<Null,O>,I> 表示1}
}
  • B<Null, O> 表示数字 0

  • 加一后变为 B<B<Null,O>,I>(正数表示需要前导零)

对 -1 加一:


impl AddOne for B<Null, I> {  // -1type Output = B<Null, O>;  // -1 + 1 = 0fn add_one(self) -> Self::Output {B::new()  // 创建 B<Null,O> 表示0}
}
  • B<Null, I> 表示数字 -1(补码表示)

  • 加一后变为 B<Null, O>(0)

  1. 递归实现(通用情况)
    最低位为 0 的情况:

impl<H, L> AddOne for B<B<H, L>, O> {type Output = <B<H, L> as NormalizeIf<I>>::Output;fn add_one(self) -> Self::Output {self.h.normalize(I)  // 0 + 1 = 1,可能产生进位}
}
  • 当最低位是 O(0) 时,加一只需将最低位变为 I(1)

  • 使用 normalize(I) 标准化数的表示

最低位为 1 的情况:


impl<H, L> AddOne for B<B<H, L>, I> {type Output = <<B<H, L> as AddOne>::Output as NormalizeIf<O>>::Output;fn add_one(self) -> Self::Output {self.h.add_one().normalize(O)  // 1 + 1 = 0 并进位}
}
  • 当最低位是 I(1) 时,加一会产生进位

  • 先对高位部分递归执行 add_one()

  • 然后处理最低位置为 O(0)时的规范化

  1. 关键点说明
  • 递归结构:

    • 通过类型系统实现递归操作

    • 从最低位开始处理,逐步向高位传播进位

  • NormalizeIf:

    • 用于处理进位后的规范化

    • 确保二进制表示的正确形式(如去除前导0后的连续0)

  • 编译期计算:

    • 所有计算都在编译期完成

    • 运行时无额外开销

  • 类型安全:

    • 通过 trait bound 确保类型约束

    • 防止非法操作

  1. 示例说明
  • B<B<Null,O>,I> (1) 加一:

    • 最低位是 I,需要进位

    • 对高位 B<Null,O> 加一得到 B<B<Null,O>,I>

    • 最低位置为 O,结果为 B<B<B<Null,O>,I>,O> (2)

  • B<B<Null,I>,O> (-2) 加一:

    • 最低位是 O,直接置为 I

    • 高位为B<Null,I>,低位为I,需要规格化 (-1)

    • 结果规格化为B<B<Null,I>,I>

这个实现展示了如何在 Rust 类型系统中实现数学运算,是类型级编程的典型示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89536.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89536.shtml

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

相关文章

国内Ubuntu访问不了github、 huggingface等

各位小伙伴们&#xff0c;大家好呀。 大家是不是经常遇到访问不了github、huggingface的情况呀。 在Ubuntu中可以这样做。 访问这个网站网站测速-Ping检测-Trace查询-Dig查询-路由跟踪查询-tools.ipip.net&#xff0c; 对于github.com&#xff0c;在这个网站输入github.com…

「Java EE开发指南」如何用MyEclipse创建企业应用项目?(一)

由于有了项目模型和管理工具&#xff0c;现在可以创建Java EE企业应用程序。在本文中您将了解到&#xff1a; 企业应用项目模型项目组织、依赖关系和类解析 该特性在MyEclipse中可用。 MyEclipse v2025.1离线版下载 1. 企业应用项目模型 MyEclipse提供了一个企业应用程序项…

ubuntu 22.04 pam 模块设置用户登录失败锁定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下内容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定时任务全解析:atd 与 crond 的区别及实战案例(含日志备份 + 时间写入)

1. atd 和 crond 两个任务管理程序的区别atd&#xff1a;用于执行一次性的定时任务&#xff0c;即设置任务在某个特定的时间点仅执行一次 &#xff0c;适合处理不需要重复执行的定时操作&#xff0c;比如在未来某个确切时间执行一个脚本、发送一份文件等场景。crond&#xff1a…

iOS加固工具有哪些?项目场景下的组合策略与实战指南

在如今的iOS项目中&#xff0c;“加固”不仅是单一手段&#xff0c;更是多工具协同应用的过程。不同项目场景对安全要求的侧重点不同&#xff0c;需要针对性地组合加固工具&#xff0c;才能最大化兼顾安全性、兼容性与效率。 本文将从常见项目场景出发&#xff0c;分析当下市面…

Xilinx Zynq:一款适用于软件定义无线电的现代片上系统

摘要——软件定义无线电可以在通用处理器 (CPU) 上实现&#xff0c;例如基于 PC 的处理器。处理器具有高度灵活性&#xff1a;它不仅可以用来处理数据样本&#xff0c;还可以控制接收器功能、显示瀑布图或运行解调软件。然而&#xff0c;由于处理速度相对较慢&#xff0c;处理器…

接口黑洞?破!安全堡垒?筑!冰火炼狱?战!MES7114W终极掌控

在工业4.0加速推进的时代&#xff0c;设备互联正面临三大关键挑战&#xff1a;多协议接口的“通信割裂”、极端环境的严苛考验&#xff0c;以及高危场景下的安全红线。在矿山井下、冶金车间、化工厂区等恶劣环境中&#xff0c;传统有线方案往往受限于高成本布线、维护困难和环境…

深入理解进程地址空间:虚拟内存与进程独立性

目录 引言 虚拟地址空间的本质 关键观察 进程地址空间布局 虚拟内存管理&#xff1a;mm_struct 虚拟内存的优势 总结 引言 在操作系统中&#xff0c;每个进程都运行在自己的独立区域中&#xff0c;这个区域就是​​进程地址空间​​。今天我们就来探讨这个看似真实实则虚…

Apache ActiveMQ 任意文件写入漏洞(CVE-2016-3088)复现利用

漏洞原理 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件&#xff0c;由于ActiveMQ是一个纯Java程序&#xff0c;因此只需要操作系统支持Java虚拟机&#xff0c;ActiveMQ便可执行 本漏洞出现在fileserver应用中&#xff0c;漏洞原理其实非常简单&#xff0c…

谷歌地球与ArcGIS Pro查看三维地形

&#xff08;1&#xff09;Google Earth Web端 通过网站&#xff1a;https://earth.google.com/&#xff0c;进入谷歌地球Web端&#xff0c;可以查看历史影像、三维地形数据、导入kml文件等。 &#xff08;2&#xff09;ArcGIS Pro查看三维场景 加载3D地形数据&#xff0c;转…

Day06_C语言网络编程20250718

01.思维导图1 什么是 modbus他是一个在工控领域非常好用的通信写 modbus协议本质上是一个 基于 tcp 协议二次封装的一个协议 什么叫做基于tcp二次封装的协议&#xff1a;我们自己写的pack_t(无论静态还是动态)&#xff0c;都是属于二次封装的协议modbus协议是一种 “主从问答式…

web开发-HTML

web开发——HTML 学习目标&#xff1a;学习HTML的基础&#xff0c;学会get和post方法区别 一、HTMLHTML是什么&#xff1f; 前端网页界面开发语言。开发工具 PyCharm、vscodePyCharm个性化设置&#xff08;字体和背景颜色&#xff09; File - setting - appearance - theme&…

主流编程语言全景图:从Python到Rust的深度解析

2024年编程语言生态报告显示&#xff0c;全球开发者使用的语言数量已达260&#xff0c;但真正主导行业的不到20种。本文带你穿透技术迷雾&#xff0c;掌握8大核心语言的本质差异。一、选择编程语言的黄金标准图表代码二、八大主流语言对比解析1. Python - 通用胶水语言特性&…

若依框架下前后端分离项目交互流程详解

在企业级前后端分离项目开发中&#xff08;如若依RuoYi&#xff09;&#xff0c;前端与后端的数据交互、安全认证、权限校验、响应处理都是必须关注的重点。本文将以“课程管理列表查询”为例&#xff0c;详细梳理整个交互流程&#xff0c;每一步均有解析说明和典型代码&#x…

cartorgapher的编译与运行

目录 cartorgapher的编译环境 cartorgapher的编译 cartographer的运行 参数的详解与调参总结 降低延迟与减小计算量 cartorgapher的编译环境 系统环境 推荐在ubuntu16.04或者18.04上进行编译 推荐使用刚装好的ubuntu系统 将ubuntu的软件源设置成清华的或者其他的中国境内的…

浅谈车载电控和机器人一体化关节电控区别和联系

类别车载电机关节电机&#xff08;伺服电机)电机PMSM 有轴 永磁体内嵌IPMPMSM&BLDC 永磁体表贴 SPM&#xff0c;转速不高&#xff0c;减少体积 关节和推杆用无框力矩电机&#xff1a;只有定子和转子&#xff0c;无轴&#xff0c;无外壳和端盖&#xff0c;便于和编码器减速器…

【数据结构】堆(下)+ 二叉树

上期回顾&#xff1a;【数据结构】树&#xff08;堆&#xff09;上 一.堆的应用 1.1堆排序&#xff08;向下调整在上一期&#xff09; 向上调整算法建堆&#xff1a; 首先先回顾一下向上调整算法 void AdjustUP(HPDataType* arr, int child) {int parent (child - 1) / 2…

Elasticsearch MCP 服务器现已在 AWS Marketplace 上提供

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Matt Ryan, Srinivas Pendyala 我们很高兴地宣布&#xff0c;Elasticsearch Model Context Protocol&#xff08; MCP &#xff09;服务器现已在 AWS Marketplace 上提供。 使用 MCP 将代理连接到 Elasticsearch …

【Linux】Makefile(一)-介绍

Makefile 本篇博客是作者在学习Linux方面知识过程中&#xff0c;对Makefile片面的了解&#xff0c;从而产生了对Makefile有一个全面的认识的想法&#xff0c;在知道《跟我一起写Makefile》此书后&#xff0c;作者学习阅读过程中整理出的笔记。 目录Makefilemakefile介绍:规则&…

Java爬虫与正则表达式——用正则来爬取数据

APIJava帮我们写好的各种功能的Java类。这些Java类统称为API。正则表达式就是API帮我们写好的类。正则表达式例子&#xff1a; 字符类&#xff1a;[abc]&#xff1a;只能是a&#xff0c;b或c[^abc]&#xff1a;除了a&#xff0c;b&#xff0c;c之外的任何字符[a-zA-Z]&#xff…