【PhysUnits】10 减一操作(sub1.rs)
一、源码
代码实现了一个类型级别的减一操作(Sub1 trait),通过Rust的类型系统在编译期完成数值减一的计算。
//! 减一操作特质实现 / Decrement operation trait implementation
//!
//! 提供类型级别的减一计算 / Provides type-level decrement operationuse super::basic::{B0, B1, Z0, N1, Integer, NonZero};/// 减一特质 / Decrement trait
///
/// 为类型系统提供减一操作的计算能力
/// Provides decrement operation capability for type system
pub trait Sub1 {/// 减一后的输出类型 / Output type after decrementtype Output;
}// ========== 基础类型实现 / Basic Type Implementations ==========/// Z0 (0) 减一实现 / Decrement for Z0 (0)
///
/// 0 - 1 = -1 (N1)
impl Sub1 for Z0 {type Output = N1;
}/// N1 (-1) 减一实现 / Decrement for N1 (-1)
///
/// -1 - 1 = -2 (B0<N1>)
impl Sub1 for N1 {type Output = B0<N1>;
}/// B1<Z0> (+1) 减一特化实现 / Specialized decrement for B1<Z0> (+1)
///
/// 说明:为表示简洁,高位固定为B0<N1>和B1<Z0>,减1时为b1<B0<N1>>和B0<Z0>,
/// 其B0<Z0>不符合简洁规则,因此B1<Z0>减1必须特化为Z0
///
/// Note: For concise representation, high bits are fixed as B0<N1> and B1<Z0>.
/// When decrementing, B0<Z0> doesn't follow concise rules,
/// so B1<Z0> must be specialized to Z0
impl Sub1 for B1<Z0> {type Output = Z0;
}// ========== 递归类型实现 / Recursive Type Implementations ==========/// B0<H> 减一实现 / Decrement for B0<H>
///
/// 处理借位情况 / Handles borrow case
/// ...0 -1 = ...1(高位借位) / ...0 -1 = ...1(with borrow)
impl<H> Sub1 for B0<H>
whereH: Sub1 + Integer,
{type Output = B1<H::Output>;
}/// B1<H> 减一实现 / Decrement for B1<H>
///
/// 直接减一无需借位 / Direct decrement without borrow
/// ...1 -1 = ...0 / ...1 -1 = ...0
impl<H> Sub1 for B1<H>
whereH: NonZero,
{type Output = B0<H>;
}
-
定义了一个Sub1 trait,只有关联类型Output没有方法
-
表示"当前类型减一后的结果类型"
三、基础类型实现
零的减一 (Z0 → N1)
impl Sub1 for Z0 {type Output = N1; // 0 -1 = -1
}
- 零减一得到负一(N1)
负一的减一 (N1 → B0)
impl Sub1 for N1 {type Output = B0<N1>; // -1 -1 = -2
}
- -1减一得到-2,用二进制表示为B0(即…10)
正一的减一 (B1 → Z0)
impl Sub1 for B1<Z0> {type Output = Z0; // 1 -1 = 0
}
-
特化处理+1减一的情况,直接返回零(Z0)
-
注释说明这是为了保持表示的简洁性,避免产生B0这种不符合规范的形式
四、递归类型实现
以0结尾的数 (B0)
impl<H> Sub1 for B0<H>
whereH: Sub1 + Integer,
{type Output = B1<H::Output>; // ...0 → ...1(高位借位)
}
-
处理形如…0的二进制数
-
需要向高位借位,所以递归调用高位的减一操作
-
当前位从0变成1(因为借位后2-1相当于1)
以1开头的数 (B1)
impl<H> Sub1 for B1<H>
whereH: NonZero,
{type Output = B0<H>; // 0...1 → ...0
}
-
处理形如…1的二进制数
-
直接当前位从1变成0,不需要借位
-
通过NonZero约束排除了B1的情况(已特化处理)
五、设计特点
- 类型安全:
-
所有操作在编译期完成
-
通过trait系统保证正确性
- 二进制补码表示:
-
正确处理正负数的减一
-
负数用补码表示(如-1表示为全1)
- 递归结构:
-
通过类型递归处理任意长度的二进制数
-
自动处理借位问题
- 边界条件处理:
-
专门处理0、-1、+1等边界情况
-
通过特化实现避免非法状态
六、使用示例
type Two = B0<B1<Z0>>; // +2 (0b10)
type MinusTwo = B0<N1>; // -2 (0b...1110)type One = <Two as Sub1>::Output; // +1 (B1<Z0>)
type MinusThree = <MinusTwo as Sub1>::Output; // -3 (B1<N1>)
这个实现展示了如何利用Rust的类型系统在编译期完成数学运算,是类型级编程的典型应用。
相关文章:
【PhysUnits】10 减一操作(sub1.rs)
一、源码 代码实现了一个类型级别的减一操作(Sub1 trait),通过Rust的类型系统在编译期完成数值减一的计算。 //! 减一操作特质实现 / Decrement operation trait implementation //! //! 提供类型级别的减一计算 / Provides type-level decrement operationuse su…...

深度检测与动态透明度控制 - 基于Babylon.js的遮挡检测实现解析
首先贴出实现代码: OcclusionFader.ts import { AbstractEngine, Material, type Behavior, type Mesh, type PBRMetallicRoughnessMaterial, type Scene } from "babylonjs/core"; import { OcclusionTester } from "../../OcclusionTester"…...
Linux下使用socat将TCP服务转为虚拟串口设备
Linux下使用socat将TCP服务转为虚拟串口设备 socat是一个强大的网络工具,可以将TCP连接转换为虚拟串口设备,这在嵌入式开发、工业控制等领域非常有用。下面详细介绍如何实现这一功能。 基本原理 socat可以通过创建伪终端(PTY)来模拟串口设备ÿ…...

docker push 报错 denied: requested access to the resource is denied
问题:当 docker logout -> docker login 用户登录,但仍然无法 docker push $ docker push <username>/nginx-custom:v1 The push refers to repository [docker.io/jagger/nginx-custom] 340e6d3ea0c7: Preparing 941dd9dd8ee4: Preparing f6…...

epub→pdf | which 在线转换??好用!!
1、PDF派(free&quick) pdf转word_pdf转换成excel_pdf转换成ppt _纬来PDF转换器 评价:目前使用免费,转化的时候有进度条提示,总的来说比较快,50mb的文件在40秒内可以转换完成,推荐 2、pdfconvert(free…...
PBX、IP PBX、FXO 、FXS 、VOIP、SIP 的概念解析以及关系
PBX(Private Branch Exchange) 概念 :PBX 是专用交换机,是一种在企业或组织内部使用的电话交换系统。它允许内部用户之间以及内部用户与外部公共电话网络(PSTN)之间进行通信。例如,在一个大型企…...

MySQL数据高效集成到金蝶云星空的技术分享
MySQL数据集成到金蝶云星空的技术案例分享:SR新建调拨单内部供应商-深圳天一 在企业信息化系统中,数据的高效流动和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到金蝶云星空,以支持…...
git 命令之-git cherry-pick
今天得到一个通知,这个业务版本里面部分已经开发但还没测试的内容要新开一个分支提交,但是我已经有几个提交上去了,难道只能一个一个文件复制到新的分支吗?我不,我找到了这个git命令,可以解决我的困惑&…...
如何在STM32CubeMX下为STM32工程配置调试打印功能
为STM32工程配置调试打印功能 一、配置调试用的打印串口 #include <stdio.h> //标准输入输出库//1.在STM32CubeMX中打开并配置好某串口设备; //2.在main.c文件中添加如下代码行对输入输出重定向; //3.在文件开头包含stdio.h头文件。 #pragma im…...

Linux系统 - 基本概念
介绍一些Linux系统的基本概念 1 操作系统的核心—内核 “操作系统”通常包含两种不同含义。 1.指完整的软件包,这包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具,诸如命令行解释器、图形用户界面、文件操作工具…...
kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器
kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器 js 代码 其他地方用直接导入js getCurrentUserId 这是自己后端获取 域账号地址 我是成功返回200 //true普通浏览器 fasle 无痕浏览器 export const checkBrowserMode async () > {try {const response a…...
在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core
本文将通过一个实际的 Vue3 组件示例,带你一步步实现“按住录音,松开发送,上滑取消”的语音录制功能。 我们将使用强大且小巧的开源库 recorder-core,支持 MP3、WAV、AAC 等编码格式,兼容性较好。 🔧 项目…...

PDF电子发票数据提取至Excel
声明:本软件是吾爱大佬th4c3y原创,本人只是搬运工! 发票识别更新记录 【2025-3-14】更新 v2.0 在字段设置中新增自定义字段(仅在 PDF 正则式接口下生效),支持自定义正则表达式或固定字符。 自定义字段会…...

【身份证识别表格】把大量手机拍摄的身份证信息转换成EXCEL表格的数据,拍的身份证照片转成excel表格保存,基于WPF和腾讯OCR的实现方案
基于WPF和腾讯OCR的身份证照片转Excel方案 应用场景 企业人事管理:新员工入职时批量录入数百份身份证信息,传统手动录入易出错且耗时。通过OCR自动提取姓名、身份证号等字段,生成结构化Excel表格,效率提升10倍以上。 …...

FPGA高速接口 mipi lvds cameralink hdml 千兆网 sdi
mipi: https://blog.csdn.net/SDJ_success/article/details/146541776 cameralink CameraLink协议 CameraLink协议是一种专门针对机器视觉应用领域的串行通信协议,它使用低压差分信号(LVDS)进行数据的传输和通信。CameraLink标准是在ChannelLink标准的基础上多加了…...

Linux路径解析指南:逻辑路径 vs 实际路径详解
在 Linux 系统中,逻辑路径(Logical Path)和 实际路径(Physical Path)是两个不同的概念,主要区别在于它们如何解析文件或目录的位置。以下是详细解释: 目录 1. 逻辑路径(Logical Path…...

Azure 公有云基础架构与核心服务:从基础到实践指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 Azure 的基础架构由多个核心组件构成,理解这些概念是掌握其技术框架的第一步: 地理区域(Geographic R…...

【运维_日常报错解决方案_docker系列】一、docker系统不起来
今天忽然想起来哎,还有一台”尘封“着的服务器,好久没用了,就随便打开登了登,然后想看一下服务器上面还有正在跑着的容器服务吗,然后使用docker ps 发现报错了。 然后重启也是下面这个状态。 查看docker状态…...

C# 数组与字符串:全面解析与应用实践
在C#编程语言中,数组和字符串是两种最基础也是最重要的数据类型。无论是简单的控制台应用程序,还是复杂的企业级系统,数组和字符串都扮演着不可或缺的角色。本文将全面深入地探讨C#中数组和字符串的特性、使用方法、性能考量以及实际应用场景…...
前端vue中使用signalr
一、引入SignalR库 使用NPM引入SignalR库 npm install @microsoft/signalrJs文件中引入 import * as signalR from @microsoft/signalr;二、初始化连接 这一步需要指定SignalR Hub的URL。 const connection = new signalR.HubConnectionBuilder().withUrl("https://y…...
Stable Diffusion底模对应的VAE推荐
以下是主流Stable Diffusion底模对应的VAE推荐表格: 底模版本推荐VAE类型说明SD1.5SD1.5专用VAE通常使用vae-ft-mse-840000-ema-pruned.safetensorsSD2.0SD1.5兼容VAE或SD2专用VAE部分SD2模型需配套512-ema-only.vae.ptSD3内置VAESD3系列模型通常自带集成VAE无需额…...
centos7.5安装kubernetes1.25.0
centos7.5安装kubernetes centos7.5kubernetes1)准备阶段准备2台虚拟机配置静态IP修改主机名桥接设置配置阿里云的repo源配置k8s切国际源配置时间同步安装基础软件包 2)安装containerd服务安装配置开启启动 3)安装k8s4)安装kubersphere下载helm安装包解压将helm配置…...

AT2659S射频前端芯片技术解析:L1频段低噪声高增益GNSS信号放大
以下是关于AT2659S L1频段卫星导航射频前端芯片的客观描述,严格基于用户提供的原始信息,采用分享式表述,保持参数和核心内容不变: AT2659S芯片概述 AT2659S是一款基于SiGe工艺的射频前端芯片,专为L1频段&#…...

ROS2学习(15)------ROS2 TF2 机器人坐标系管理器
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 ROS版本:2 在 ROS 2 中,TF2(Transform Library, v2) 是一个非常核心的工具库,用于管理多个坐标系之间的 变换关系(tran…...
每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)
洛谷P3382 三分法求极值详解 题目描述 P3382 三分法 要求在给定区间内寻找一个多项式函数的最大值点。题目保证函数在区间内先严格递增后严格递减(单峰函数),适合使用三分法求解。 算法原理 三分法核心思想 对于单峰函数,在区…...

Vue+css实现扫描动画效果(使用@keyframes scan)
实现效果 扫描效果 参考链接 MDN Web Docs: CSS Animations 关键代码 示例代码 <div class"scanner-container"><div class"scanner-line"></div><div class"scanner-icon">📷</div><p>Scan m…...
Windows 配置 ssh 秘钥登录 Ubuntu
在 Windows 上推送 SSH 公钥到远程服务器(类似于 Linux 上的 ssh-copy-id)可以通过以下几种方法实现: ** 手动复制公钥内容** 查看本地公钥内容:type $env:USERPROFILE\.ssh\id_rsa.pub登录远程服务器,将公钥内容粘贴…...
Conda:环境移植及更新1--使用conda-pack
更多内容:XiaoJ的知识星球 目录 一、使用conda-pack1.安装 conda-pack2.移植整个 Anaconda 环境3.移植单个虚拟环境4.验证是否生效 在相同Linux设备上移植Miniconda3(Anaconda3同理)常用方法有。 使用conda-pack:使用conda-pack工…...
github好玩的工具
以下是 GitHub 上一些有趣且实用的开源工具推荐,涵盖 AI 应用、效率提升、趣味开发等方向,结合最新趋势和项目热度整理: 一、AI 与深度伪造工具 Deep-Live-Cam 仅需一张图片即可在视频直播中实时替换人脸,适用于内容创作和虚拟角色开发,支持多平台硬件运行(如 NVIDIA CUD…...

PHP学习笔记(九)
箭头函数 箭头函数是 PHP 7.4的新语法。是一种更简洁的匿名函数的写法,它们都是closure类的实现。 箭头函数的基本语法为fn(argument_list) > expr 箭头函数支持与匿名函数相同的功能,只是其父作用域的变量总是自动的。 当表…...