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

【PhysUnits】9 取负重载(negation.rs)

一、源码

这段代码是类型级二进制数(包括正数和负数)的取反和取负操作。它使用了类型系统来表示二进制数,并通过特质(trait)和泛型来实现递归操作。

use super::basic::{B0, B1, Z0, N1};
use core::ops::Neg;// ==================== 反码特质 ====================
pub(crate) trait Invert {type Output;
}impl Invert for Z0 { // Z0 (0) 的取反type Output = N1;
}impl Invert for N1 { // N1 (-1) 的取反type Output = Z0;
}impl<H: Invert> Invert for B0<H> { // B0<H> (...0) 的取反type Output = B1<H::Output>;
}impl<H: Invert> Invert for B1<H> { // B1<H> (...1) 的取反type Output = B0<H::Output>;
}// ==================== 运算符重载 ====================
impl Neg for Z0 { // Z0 (0) 的取负type Output = Z0;fn neg(self) -> Self::Output {Z0}
}impl Neg for N1 { // N1 (-1) 的取负type Output = B1<Z0>;fn neg(self) -> Self::Output {B1::new()}
}impl Neg for B1<Z0> { // 特化B1<Z0> (1) 的取负,防止负数最高位有B1type Output = N1;fn neg(self) -> Self::Output {N1}
}impl<H> Neg for B0<H>
whereH: Neg,  // 只需要递归取负
{type Output = B0<<H as Neg>::Output>;   // 递归调用Negfn neg(self) -> Self::Output {B0::new()  // 递归调用Neg}
}impl<H> Neg for B1<H>
whereH: Invert, 
{type Output = B1<<H as Invert>::Output>;  // 没有进位了,高位取反fn neg(self) -> Self::Output {B1::new() }
}

二、基本类型导入

use super::basic::{B0, B1, Z0, N1};
use core::ops::Neg;
  • B0和B1表示二进制位0和1

  • Z0表示数值0,同时表示正数高位停止符

  • N1表示数值-1,同时表示负数高位停止符

  • Neg是Rust的标准负号运算符特质

三、反码特质Invert

pub(crate) trait Invert {type Output;
}

这个特质定义了类型级别的取反操作(按位取反),关联类型Output表示取反后的结果类型。

具体实现:

  • Z0的取反:0的按位取反是-1
impl Invert for Z0 {type Output = N1;
}
  • N1的取反:-1的按位取反是0
impl Invert for N1 {type Output = Z0;
}
  • B0的取反:以0结尾的数取反后变为以1结尾,高位继续取反
impl<H: Invert> Invert for B0<H> {type Output = B1<H::Output>;
}
  • B1的取反:以1结尾的数取反后变为以0结尾,高位继续取反
impl<H: Invert> Invert for B1<H> {type Output = B0<H::Output>;
}

四、负号运算符重载Neg

这部分实现了数值的取负操作(补码表示)。

具体实现:
  • Z0的取负:0的负数还是0
impl Neg for Z0 {type Output = Z0;fn neg(self) -> Self::Output {Z0}
}
  • N1的取负:-1的负数是1(用B1表示)
impl Neg for N1 {type Output = B1<Z0>;fn neg(self) -> Self::Output {B1::new()}
}
  • B1的特化处理:1的负数是-1(防止负数最高位出现B1)
impl Neg for B1<Z0> {type Output = N1;fn neg(self) -> Self::Output {N1}
}
  • B0的取负:以0结尾的数取负,高位直接取负,低位保持0
impl<H> Neg for B0<H>
whereH: Neg,
{type Output = B0<<H as Neg>::Output>;fn neg(self) -> Self::Output {B0::new()}
}
  • B1的取负:以1结尾的数取负,高位取反(不需要进位)
impl<H> Neg for B1<H>
whereH: Invert, 
{type Output = B1<<H as Invert>::Output>;fn neg(self) -> Self::Output {B1::new() }
}

五、关键点说明:

  1. 类型级编程:这是在编译期通过类型系统进行的计算,没有运行时开销。

  2. 二进制表示:

  • B0表示在类型H表示的二进制数后面加个0

  • B1表示在类型H表示的二进制数后面加个1

  1. 负数表示:使用补码形式,N1表示负号位及该位及更高位全1。

  2. 递归处理:通过泛型和特质约束实现递归操作。

六、示例说明:

  • 取反操作(按位非):

    • !0 (Z0) → -1 (N1)

    • !-1 (N1) → 0 (Z0)

    • !B0 (2) → B1 (-3)

  • 取负操作:

    • -0 (Z0) → 0 (Z0)

    • –1 (N1) → 1 (B1)

    • -B1 (1) → -1 (N1)

这段代码展示了Rust强大的类型系统能力,可以在编译期完成复杂的数值运算类型推导。

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

相关文章:

  • el-input宽度自适应方法总结
  • Matlab入门
  • 个人理解 火山引擎的实时对话 AI 如何利用 WebRTC、大模型、语音识别(ASR)、语音合成(TTS)等技术实现低延迟的实时对话功能。
  • PostgreSQL 数据库备份与恢复
  • 学习黑客 tcpdump
  • 服务器为什么会产生垃圾文件
  • 【JS】Vue 3中ref与reactive的核心区别及使用场景
  • 【JVM 02-JVM内存结构之-程序计数器】
  • 提升推理能力会丢失指令跟随的能力?——【论文阅读笔记】
  • 从逻辑学视角严谨证明数据加密的数学方法与实践
  • 多级Cache
  • 城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?
  • 使用 kafka-console-consumer.sh 指定时间或偏移量消费
  • 【golang】能否在遍历map的同时删除元素
  • HTTP协议接口三种测试方法之-postman
  • LinkedList 与 ArrayList 的区别及使用场景
  • 想免费使用 AWS 云服务器?注册、验证及开通全攻略
  • NV054NV057美光固态闪存NV059NV062
  • 穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A
  • 2025 全球优质 AI 产品深度测评:从通用工具到垂直领域的技术突围 —— 轻量聚合工具篇
  • Sentinel+OpenFeign实现服务熔断与降级:构建弹性微服务架构的核心实践
  • 响应面法(Response Surface Methodology ,RSM)
  • Go语言中内存释放 ≠ 资源释放
  • 【JVM 03-JVM内存结构之-虚拟机栈】
  • 二极管的伏安特性与主要参数
  • C++笔记-封装红黑树实现set和map
  • 【工具类】常用的工具类——CollectionUtil
  • 服务器数据迁移终极指南:网站、数据库、邮件无缝迁移策略与工具实战 (2025)
  • iOS 直播弹幕礼物功能详解
  • HarmonyOS 鸿蒙应用开发基础:转换整个PDF文档为图片功能