一、源码

这个模块实现了类型级别的二进制数标准化处理,确保二进制数在组合时保持最简形式。

//! 二进制数字标准化模块
//!
//! 提供二进制数字(B<H, L>)的组合前标准化功能,确保数字以最简形式表示,
//! 避免同一数值有不同表示形式。
//!
//! 示例:
//! - 当 H = B<Null, O> 且 L = O 时 => 标准化为 B<Null, O>
//! - 当 H = B<Null, I> 且 L = I 时 => 标准化为 B<Null, I>
//! - 当 H = O 且 L = Null 时 => 标准化为 Null
//! 
use crate::number::{Null, O, I, B, Bit};/// 标准化条件判断 trait
/// 根据给定的最低位(L)对数字进行标准化处理
pub trait NormalizeIf<L> {type Output;fn normalize(self, l:L) -> Self::Output;
}// 基础情况:当高位为 Null 时,直接构造 B<Null, X>
impl<X: Bit> NormalizeIf<X> for Null {type Output = B<Null, X>;fn normalize(self, _: X) -> Self::Output {B::new()}
}// 规则1: 当 H = B<Null, O> 且 L = O 时,简化成高位
impl NormalizeIf<O> for B<Null, O> {type Output = Self;fn normalize(self, _: O) -> Self::Output {self}
}// 规则1补充: 当 H = B<Null, I> 且 L = O 时,构造 B<B<Null, I>, O>
impl NormalizeIf<O> for B<Null, I> {type Output = B<Self, O>;fn normalize(self, _bit: O) -> Self::Output {B::new()}
}// 规则2: 当 H = B<Null, I> 且 L = I 时,简化成高位
impl NormalizeIf<I> for B<Null, I> {type Output = Self;fn normalize(self, _: I) -> Self::Output {self}
}// 规则2补充: 当 H = B<Null, O> 且 L = I 时,构造 B<B<Null, O>, I>
impl NormalizeIf<I> for B<Null, O> {type Output = B<Self, I>;fn normalize(self, _: I) -> Self::Output {B::new()}
}// 通用情况: 对于更复杂的嵌套结构(B<B<B<HH, HL>, L>, LL>),保持原结构
// 假设更高位已经是简化过的,或者需要手动调用该 trait 进行简化
impl<HH, HL: Bit, L: Bit, LL: Bit> NormalizeIf<LL> for B<B<HH, HL>, L> {type Output = B<Self, LL>;fn normalize(self, bit: LL) -> Self::Output {B::new()}
}// 纯小数规则: 当 L = Null 且 H = O 时,简化成低位
impl NormalizeIf<Null> for O {type Output = Self;fn normalize(self, bit: Null) -> Self::Output {bit}
}// 纯小数规则补充1: 当 L = Null 且 H = I 时,构造 B<I, Null>
impl NormalizeIf<Null> for I {type Output = B<I, Null>;fn normalize(self, _bit: Null) -> Self::Output {B::new()}
}// 纯小数规则补充2: 当 L = B结构体B<LH, LL> 且 H 为Bit 时,构造 B<H, B<LH, LL>>
// 假设更低位已经是简化过的,或者需要手动调用该 trait 进行简化
impl<H: Bit, LH: Bit, LL> NormalizeIf<B<LH, LL>> for H {type Output = B<H, B<LH, LL>>;fn normalize(self, _bit: B<LH, LL>) -> Self::Output {B::new()}
}pub type IfB0<H> = <H as NormalizeIf<O>>::Output;
pub type IfB1<H> = <H as NormalizeIf<I>>::Output;
pub type IfNull<H> = <H as NormalizeIf<Null>>::Output; //该规则仅用于小数部分

二、模块基础结构

  1. 类型定义

模块使用了以下基础类型(来自crate::number):

  • Null - 表示空位/终止位

  • O - 表示二进制0

  • I - 表示二进制1

  • B<H, L> - 二进制数构造器,H是高位,L是最低位

  • Bit - trait,被O和I实现

  1. 核心Trait

pub trait NormalizeIf<L> {type Output;fn normalize(self, l: L) -> Self::Output;
}

这是一个泛型trait,用于定义标准化行为:

  • L - 输入的最低位类型

  • Output - 标准化后的输出类型

  • normalize - 执行标准化的方法

三、标准化规则实现

  1. 基础情况 - 处理Null高位

impl<X: Bit> NormalizeIf<X> for Null {type Output = B<Null, X>;fn normalize(self, _: X) -> Self::Output {B::new()}
}
  • 当高位是Null时,直接构造B<Null, X>

  • 例如:Null + O → B<Null, O> (表示0)

  • B::new()是构造新二进制数的函数

  1. 规则1 - 处理O(0)结尾的情况
    简化情况:

impl NormalizeIf<O> for B<Null, O> {type Output = Self;fn normalize(self, _: O) -> Self::Output {self}
}
  • 当H = B<Null, O>且L = O时,保持原样

  • 避免B<B<Null,O>,O>这样的冗余结构,直接返回B<Null,O>

非简化情况:


impl NormalizeIf<O> for B<Null, I> {type Output = B<Self, O>;fn normalize(self, _bit: O) -> Self::Output {B::new()}
}
  • 当H = B<Null, I>且L = O时,构造B<B<Null,I>,O>

  • 表示二进制"10"(十进制2)

  1. 规则2 - 处理I(1)结尾的情况
    简化情况:

impl NormalizeIf<I> for B<Null, I> {type Output = Self;fn normalize(self, _: I) -> Self::Output {self}
}
  • 当H = B<Null, I>且L = I时,保持原样

  • 避免B<B<Null,I>,I>这样的冗余结构,直接返回B<Null,I>

非简化情况:


impl NormalizeIf<I> for B<Null, O> {type Output = B<Self, I>;fn normalize(self, _: I) -> Self::Output {B::new()}
}
  • 当H = B<Null, O>且L = I时,构造B<B<Null,O>,I>

  • 表示二进制"01"(十进制1)

  1. 通用情况 - 处理嵌套结构

impl<HH, HL: Bit, L: Bit, LL: Bit> NormalizeIf<LL> for B<B<HH, HL>, L> {type Output = B<Self, LL>;fn normalize(self, bit: LL) -> Self::Output {B::new()}
}
  • 对于更复杂的嵌套结构(如B<B<B<H,L1>,L2>),保持原结构

  • 假设更高位已经是简化过的,或者需要手动调用该trait进行简化

  • 例如:B<B<Null,O>,I> + O → B<B<B<Null,O>,I>,O>(表示"010")

  1. 纯小数规则
    简化情况:

impl NormalizeIf<Null> for O {type Output = Self;fn normalize(self, bit: Null) -> Self::Output {bit}
}
  • 处理小数部分,当H = O且L = Null时,返回Null

  • 用于表示纯小数如"0.xxx"

非简化情况:


impl NormalizeIf<Null> for I {type Output = B<I, Null>;fn normalize(self, _bit: Null) -> Self::Output {B::new()}
}
  • 当H = I且L = Null时,构造B<I, Null>

  • 用于表示纯小数如"1.xxx"


impl<H: Bit, LH: Bit, LL> NormalizeIf<B<LH, LL>> for H {type Output = B<H, B<LH, LL>>;fn normalize(self, _bit: B<LH, LL>) -> Self::Output {B::new()}
}
  • 当L是B结构体且H为Bit时,构造B<H, B<LH, LL>>

  • 用于处理更复杂的小数部分结构

  1. 类型别名

pub type IfB0<H> = <H as NormalizeIf<O>>::Output;
pub type IfB1<H> = <H as NormalizeIf<I>>::Output;
pub type IfNull<H> = <H as NormalizeIf<Null>>::Output;

这些类型别名提供了:

  • IfB0 - 当最低位是O时的标准化结果

  • IfB1 - 当最低位是I时的标准化结果

  • IfNull - 专门用于小数部分的标准化

五、设计模式分析

这个模块体现了多种设计模式:

  • 策略模式:通过不同的trait实现提供不同的标准化策略

  • 递归结构:使用泛型和关联类型处理嵌套的二进制结构

  • 类型级编程:在编译期完成所有标准化操作

  • 零成本抽象:运行时没有任何额外开销

六、使用示例

有以下二进制数:

  • B<Null, O> → 0

  • B<Null, I> → 1

  • B<B<Null, O>, I> → 01 (1)

  • B<B<Null, I>, O> → 10 (2)

标准化过程会确保:

  1. B<Null, O> + O → B<Null, O> (而不是B<B<Null,O>,O>)

  2. B<Null, I> + I → B<Null, I> (而不是B<B<Null,I>,I>)

  3. 更复杂的结构保持原样,除非有明确的简化规则

七、总结

这个二进制标准化模块:

  1. 通过类型系统保证二进制数的规范表示

  2. 消除冗余的前导零和重复结构

  3. 支持整数和小数部分的标准化

  4. 在编译期完成所有处理,运行时无开销

  5. 为类型安全的二进制运算提供基础

这种设计在需要精确控制二进制表示的场合(如物理单位、协议实现等)特别有用,可以避免许多潜在的边界情况错误。

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

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

相关文章

解决OpenHarmony中找不到pthread_cancel和pthread_setcanceltype等libc符号的问题

笔者在移植三方库到OpenHarmony时遇到了pthread_cancel和pthread_setcanceltype函数找不到的问题&#xff0c;将解决办法分享如下&#xff1a; OpenHarmony的使用的c库musl中注释了这些函数的导出&#xff0c;在third_party/musl/libc.map.txt将屏蔽的函数中取消注释即可

Python编程进阶知识之第五课处理数据(matplotlib)

简介matplotlib 是 Python 中最流行的数据可视化库之一&#xff0c;它可以创建各种高质量的图表。无论是简单的折线图&#xff0c;还是复杂的 3D 图形&#xff0c;matplotlib 都能轻松应对。它提供了类似 MATLAB 的绘图接口&#xff0c;使得用户可以非常方便地进行图表的创建和…

rust-所有权

什么是所有权 所有权是一组规则&#xff0c;它决定了 Rust 程序如何管理内存。所有运行中的程序都必须管理它们对计算机内存的使用方式。某些语言使用垃圾回收&#xff08;GC&#xff09;&#xff0c;在程序运行时定期查找不再使用的内存&#xff1b;另一些语言则要求程序员显式…

破解哈希极化:基于主动路径规划的智算网络负载均衡方案

如今人工智能&#xff08;AI&#xff09;和大模型训练的蓬勃发展&#xff0c;大规模AI算力集群&#xff08;智算集群&#xff09;已成为关键基础设施。这类集群对网络性能&#xff0c;特别是高吞吐、低延迟和无损特性有着严苛要求&#xff0c;RoCE因此被广泛应用。然而&#xf…

Vue工程化 ElementPlus

一、Vue工程化1、环境准备create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目。提供了以下功能&#xff1a;统一的目录结构本地调试热部署单元测试集成打包上线依赖环境&#xff1a;Node JS 是一个免费、开源、跨平台的JavaScript运行时环…

深入解析TCP:可靠传输的核心机制与实现逻辑

Linux 系列 文章目录Linux 系列前言一、TCP协议的概念1.1 TCP协议的特点1.2 TCP又叫做传输控制协议二、TCP协议段格式2.1、TCP的流量控制----------窗口大小&#xff08;16位&#xff09;2.2 TCP的确认应答机制2.2.1 什么是确认应答机制2.2.2 确认应答机制的优化2.3 超时重传机…

通缩浪潮中的 “测量防线”:新启航如何用国产 3D 白光干涉仪筑牢半导体成本护城河?

一、通缩浪潮下半导体行业的成本困局在通缩浪潮冲击下&#xff0c;半导体行业面临市场需求疲软、产品价格下滑的严峻挑战。为维持竞争力&#xff0c;降低生产成本成为企业生存发展的关键。而 3D 白光干涉仪作为半导体晶圆检测、制程监控的核心设备&#xff0c;传统进口产品价格…

[网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 D盾防火墙D盾,D盾_防火墙,D盾_IIS防火墙,D盾_web查杀,IIS防火墙,webshell查杀,https://www.d99net.net/ 0x01&#xff1a;D 盾 —— 工具简介 D 盾防火…

Spring AI 系列之二十二 - ImageModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

Redis集群高可用与性能优化实战指南

Redis集群高可用与性能优化实战指南 一、业务场景描述 在大型分布式系统中&#xff0c;Redis不仅承担缓存职责&#xff0c;还常用于限流、排行榜、会话管理等高并发场景。随着访问量的激增和集群规模的扩展&#xff0c;如何保证Redis服务的高可用性与高性能&#xff0c;成为后端…

基于SpringBoot+Vue的高校特长互助系统(WebSocket实时聊天、协同过滤算法、ECharts图形化分析)

“ &#x1f388;系统亮点&#xff1a;WebSocket实时聊天、协同过滤算法、ECharts图形化分析”01系统开发工具与环境搭建前后端分离架构项目架构&#xff1a;B/S架构运行环境&#xff1a;win10/win11、jdk17前端&#xff1a;技术&#xff1a;框架Vue.js&#xff1b;UI库&#x…

于纵横交错的矩阵间:二维数组与多维数据的默契和鸣

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 接着上节课的内容,这一节我们来学习二维数组,学习二维数组的概念和创建,明白二维数组的初始化,学会不完全初始化,完全初始化,按照行初始化的…

SHA-3算法详解

SHA-3&#xff08;Secure Hash Algorithm 3&#xff09;是美国国家标准与技术研究院&#xff08;NIST&#xff09;于 2015 年发布的新一代密码哈希算法标准&#xff0c;其核心基于比利时密码学家团队设计的Keccak 算法。SHA-3 的诞生旨在应对 SHA-1 和 SHA-2 系列算法可能面临的…

前端笔记:同源策略、跨域问题

只有前端才会有跨域问题后端不受限制 一、什么是“同源策略”&#xff08;Same-Origin Policy&#xff09; ✅ 定义&#xff1a; 浏览器的 同源策略 是一种 安全机制&#xff0c;限制一个源的 JavaScript 访问另一个源的资源&#xff0c;以防止恶意网站窃取用户敏感信息。 ✅ “…

java通过com进行pdf转换docx丢失

使用&#xff0c;通过com调用&#xff0c;发现pdf转换成docx后&#xff0c;没有看到docx输出到指定目录。直接说解决方案:关闭的保护模式即可&#xff0c;打开工具&#xff0c;编辑->首选项 找到安全性(增强)&#xff0c;关闭启动时启用保护模式关闭后&#xff0c;docx正常输…

SQL基础⑫ | 视图篇

0 序言 本文将系统讲解数据库中视图的相关知识&#xff0c;包括视图的定义、作用、创建&#xff08;单表、多表、基于视图创建&#xff09;、查看、更新、修改与删除操作&#xff0c;以及视图的优缺点。 通过学习&#xff0c;你能够掌握视图的基本概念&#xff0c;理解何时及如…

移动云×华为昇腾:“大EP+PD分离”架构实现单卡吞吐量跨越式提升!

在面向下一代AI基础设施的关键技术攻关中&#xff0c;移动云与华为昇腾计算团队深度协同&#xff0c;实现了大模型推理引擎的架构级突破。双方基于昇腾AI基础软硬件平台&#xff0c;针对DeepSeek大模型完成了大规模专家并行&#xff08;Expert Parallelism&#xff0c;简称“大…

配电自动化终端中电源模块的设计

配电自动化终端中电源模块的设计 引言 配电终端设备的可靠性和自动化程度,直接影响到整个配电自动化系统的可靠性和自动化水平。由于配电终端设备一般安装于户外或比较偏僻的地方,不可能有直流电源提供,因此,配电网终端设备的直流供电方式成为各配网自动化改造中必须要研究…

性能测试-groovy语言1

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 Jmeter之Groovy语言Groovy简介为何性能测试中选择Groovywindows下载Groovy进入官网配置环境变量Groovy的数据类型groovy的保留字字符…

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL线刷固件包

天邑TY1613_S905L3SB_安卓9-高安非-高安版-通刷-TTL线刷固件包刷机说明&#xff1a;本固件为TTL刷机方式&#xff0c;需要准备如下工具&#xff1b;电烙铁TTL线刷机优盘TTL接触点位于处理器左侧&#xff0c;从上往下数第二脚GND、3TXD、4RXD跑码工具-【工具大全】-putty跑码工具…