【unitrix】 6.11 二進制數字標準化模塊(normalize.rs)

一、源碼

這個模塊實現了類型級別的二進制數標準化處理,確保二進制數在組合時保持最簡形式。

//! 二進制數字標準化模塊
//!
//! 提供二進制數字(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跑碼工具…