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

【PhysUnits】12 加法操作(add.rs)

一、源码

这是一个类型级二进制数加法系统。

use super::basic::{B0, B1, Z0, N1, Integer, NonZero, NonNegOne};
use core::ops::Add;
use super::add1::Add1;
use super::sub1::Sub1;// ==================== Helper Traits ====================
pub trait AddB0B0Result {type Output;fn new_output() -> Self::Output;
}pub trait AddB1B0Result {type Output;fn new_output() -> Self::Output;
}// ==================== 运算符重载 ====================
/// Z0加整数
impl<I: Integer> Add<I> for Z0 {type Output = I;#[inline]fn add(self, rhs: I) -> Self::Output {rhs}
}/// 非零加Z0
//N1+Z0
impl Add<Z0> for N1 {type Output = N1;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// B0<H> 加 Z0
impl<H: Integer> Add<Z0> for B0<H> {type Output = Self;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// B1<H> 加 Z0
impl<H: Integer> Add<Z0> for B1<H> {type Output = Self;#[inline]fn add(self, _rhs: Z0) -> Self::Output {self}
}/// N1加非0数
impl<N: NonZero> Add<N> for N1
whereN: Add1,<N as Add1>::Output: Default,
{type Output = <N as Add1>::Output;#[inline]fn add(self, _: N) -> Self::Output {<N as Add1>::Output::default()}
}/// 非0非-1加N1
impl<H: Sub1 + Integer> Add<N1> for B0<H>
whereB0<H>: Sub1,<B0<H> as Sub1>::Output: Default,
{type Output = <B0<H> as Sub1>::Output;#[inline]fn add(self, _: N1) -> Self::Output {<B0<H> as Sub1>::Output::default()}
}impl Add<N1> for B1<Z0>{type Output = Z0;#[inline]fn add(self, _: N1) -> Self::Output {Z0}
}impl<H: NonZero> Add<N1> for B1<H>{type Output = B0<H>;#[inline]fn add(self, _: N1) -> Self::Output {B0::<H>::default()}
}// ==================== B0 + B0 ====================
impl<I1: Integer, I2: Integer> Add<B0<I2>> for B0<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: AddB0B0Result,
{type Output = <<I1 as Add<I2>>::Output as AddB0B0Result>::Output;#[inline]fn add(self, _rhs: B0<I2>) -> Self::Output {<<I1 as Add<I2>>::Output as AddB0B0Result>::new_output()}
}// ==================== B0 + B1 ====================
impl<I1: Integer, I2: Integer> Add<B1<I2>> for B0<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: NonNegOne,
{type Output = B1<<I1 as Add<I2>>::Output>;#[inline]fn add(self, _rhs: B1<I2>) -> Self::Output {B1::new()}
}// ==================== B1 + B0 ====================
impl<I1: Integer, I2: Integer> Add<B0<I2>> for B1<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: AddB1B0Result,
{type Output = <<I1 as Add<I2>>::Output as AddB1B0Result>::Output;#[inline]fn add(self, _rhs: B0<I2>) -> Self::Output {<<I1 as Add<I2>>::Output as AddB1B0Result>::new_output()}
}// ==================== B1 + B1 ====================
impl<I1: Integer, I2: Integer> Add<B1<I2>> for B1<I1>
whereI1: Add<I2>,<I1 as Add<I2>>::Output: Add1,<<I1 as Add<I2>>::Output as Add1>::Output: AddB0B0Result,
{type Output = B0<<<<I1 as Add<I2>>::Output as Add1>::Output as AddB0B0Result>::Output>;#[inline]fn add(self, _rhs: B1<I2>) -> Self::Output {B0::new()}
}// ==================== AddB0B0Result 实现 ====================
impl<I: Integer + NonZero> AddB0B0Result for I {type Output = B0<I>;#[inline]fn new_output() -> Self::Output {B0::new()}
}impl AddB0B0Result for Z0 {type Output = Z0;#[inline]fn new_output() -> Self::Output {Z0::new()}
}// ==================== AddB1B0Result 实现 ====================
impl<I: Integer + NonNegOne> AddB1B0Result for I {type Output = B1<I>;#[inline]fn new_output() -> Self::Output {B1::new()}
}impl AddB1B0Result for N1 {type Output = N1;#[inline]fn new_output() -> Self::Output {N1::new()}
}

二、基础类型定义

系统定义了4种核心类型:

  • Z0:表示数字0

  • N1:表示数字-1

  • B0:二进制0,H表示更高位

  • B1:二进制1,H表示更高位

三、特质(Trait)系统

定义了多个标记特质来描述数字属性:

  • Integer:标记整数类型

  • NonZero:标记非零数

  • NonNegOne:标记不是-1的数

  • Positive/Negative:标记正负数

四、加法实现的核心逻辑

加法辅助特质
  • AddB0B0Result:处理B0 + B0的结果

  • AddB1B0Result:处理B1 + B0的结果

特殊加法规则
  • Z0 + 任何数:返回该数本身

  • 任何数 + Z0:返回该数本身

  • N1 + 非零数:使用Add1特质计算结果

  • 非零非-1数 + N1:使用Sub1特质计算结果

二进制加法规则
  1. B0 + B0:
  • 递归相加内部类型

  • 结果为B0或Z0(当内部结果为Z0时)

  1. B0 + B1:
  • 递归相加内部类型

  • 结果总是B1

  1. B1 + B0:
  • 递归相加内部类型

  • 结果为B1或N1(当内部结果为N1时)

  1. B1 + B1:
  • 递归相加内部类型

  • 进位处理(使用Add1)

  • 结果为B0并进位

五、关键设计点

  1. 类型级递归:通过泛型递归表示任意长度的二进制数

  2. 模式匹配:使用不同的trait实现来处理不同的加法情况

  3. 规范化输出:自动处理B0→Z0和B1→N1的转换

  4. 进位处理:B1+B1会产生进位,通过Add1特质实现

六、示例说明

  • B1表示1 (0b1)

  • B0<B1>表示2 (0b10)

  • B1<B1>表示3 (0b11)

当计算B1 + B1(1+1)时:

  1. 内部Z0 + Z0 = Z0

  2. 应用Add1得到B1

  3. 最终结果为B0<B1>(即2)

这个系统实现了类型安全的二进制数加法,所有计算都在编译期完成,没有运行时开销。

http://www.xdnf.cn/news/8820.html

相关文章:

  • 位图与布隆过滤器
  • 历年北京邮电大学保研上机真题
  • DAY36打卡@浙大疏锦行
  • c/c++怎样编写可变参数函数.
  • Scratch游戏 | 枪战游戏
  • 鸿蒙开发:了解$$运算符
  • 检索增强生成(RAG)完全入门指南
  • Gartner报告解读《Technical Professionals Need to Track 5 ImportantLLM Developments》
  • 【网络安全】轻量敏感路径扫描工具
  • 54页 @《人工智能生命体 新启点》中國龍 原创连载
  • 07_模型训练篇-Torchvision(中):数据增强,让数据更加多样性
  • 处处可见的FOC驱动电机技术
  • Java集合框架基础知识点全面解析
  • 《仿盒马》app开发技术分享-- 定位获取(端云一体)
  • go1.24 通过汇编深入学习map引入swiss table后的源码
  • orzdba.gz 下载解压使用教程:MySQL/InnoDB 监控命令参数详解与实战技巧
  • 8天Python从入门到精通【itheima】-41~44
  • 基于Deepseek视觉语言模型识别与训练九宫格验证码
  • PrivaZer隐私保护软件:守护隐私,优化系统
  • 【Android】System分区应用自带库与原生库同名问题分析
  • PPO算法详解
  • 第八章:数据幻域 · 状态与响应的涌动之力
  • 【音视频开发】音视频基础概念
  • 技术第一篇:odoo18 的登录认证机制
  • a+b+c+d==0(用哈希表进行优化)
  • 进行性核上性麻痹患者饮食指南:防呛咳、补营养的科学吃法
  • Java NPE为什么不会导致进程崩溃(CoreDump)
  • 同为科技 智能PDU产品选型介绍 EN10/G801FLR
  • 多角色多端状态控制与锁控制
  • Java Web