【unitrix】 6.8 加一運算(add_one.rs)

一、源碼

這是一個使用 Rust 類型系統實現二進制數加一操作的代碼。

use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 類型級加一操作 trait
/// 
/// 為二進制數類型實現加一操作,返回新的類型
pub trait AddOne {/// 加一操作的結果類型type Output;/// 執行加一操作fn add_one(self) -> Self::Output;
}// 基礎類型實現 - 處理最簡單的情況
impl AddOne for B<Null, O> {type Output = B<B<Null, O>, I>;  // 0 + 1 = 1#[inline]fn add_one(self) -> Self::Output {B::new()}
}impl AddOne for B<Null, I> {type Output = B<Null, O>;  // -1 + 1 = 0#[inline]fn add_one(self) -> Self::Output {B::new()}
}// 遞歸實現 - 處理通用二進制數
impl<H, L> AddOne for B<B<H, L>, O>
whereB<H, L>: NormalizeIf<I>,  // 格式檢查
{type Output = <B<H, L> as NormalizeIf<I>>::Output;#[inline]fn add_one(self) -> Self::Output {self.h.normalize(I)  // 0 + 1 = 1,無進位,如果高位是N1時忽略I}
}impl<H, L> AddOne for B<B<H, L>, I>
whereB<H, L>: AddOne,  // 高位部分需要能加一<B<H, L> as AddOne>::Output: NormalizeIf<O>,  // 有進位,如果高位是Z0時忽略O
{type Output = <<B<H, L> as AddOne>::Output as NormalizeIf<O>>::Output;#[inline]fn add_one(self) -> Self::Output {self.h.add_one().normalize(O)  // 1 + 1 = 0 并進位}
}

二、代碼分析

  1. 核心概念
  • 類型級編程:在編譯期通過類型系統完成計算

  • 二進制表示:使用嵌套的 B<H, L> 結構表示二進制數

    • H 是高位部分

    • L 是最低位(O=0 或 I=1)

  • 加一操作:實現二進制數的遞增運算

  1. 基礎實現(簡單情況)
    對 0 加一:

impl AddOne for B<Null, O> {  // 0type Output = B<B<Null, O>, I>;  // 0 + 1 = 1fn add_one(self) -> Self::Output {B::new()  // 創建 B<B<Null,O>,I> 表示1}
}
  • B<Null, O> 表示數字 0

  • 加一后變為 B<B<Null,O>,I>(正數表示需要前導零)

對 -1 加一:


impl AddOne for B<Null, I> {  // -1type Output = B<Null, O>;  // -1 + 1 = 0fn add_one(self) -> Self::Output {B::new()  // 創建 B<Null,O> 表示0}
}
  • B<Null, I> 表示數字 -1(補碼表示)

  • 加一后變為 B<Null, O>(0)

  1. 遞歸實現(通用情況)
    最低位為 0 的情況:

impl<H, L> AddOne for B<B<H, L>, O> {type Output = <B<H, L> as NormalizeIf<I>>::Output;fn add_one(self) -> Self::Output {self.h.normalize(I)  // 0 + 1 = 1,可能產生進位}
}
  • 當最低位是 O(0) 時,加一只需將最低位變為 I(1)

  • 使用 normalize(I) 標準化數的表示

最低位為 1 的情況:


impl<H, L> AddOne for B<B<H, L>, I> {type Output = <<B<H, L> as AddOne>::Output as NormalizeIf<O>>::Output;fn add_one(self) -> Self::Output {self.h.add_one().normalize(O)  // 1 + 1 = 0 并進位}
}
  • 當最低位是 I(1) 時,加一會產生進位

  • 先對高位部分遞歸執行 add_one()

  • 然后處理最低位置為 O(0)時的規范化

  1. 關鍵點說明
  • 遞歸結構:

    • 通過類型系統實現遞歸操作

    • 從最低位開始處理,逐步向高位傳播進位

  • NormalizeIf:

    • 用于處理進位后的規范化

    • 確保二進制表示的正確形式(如去除前導0后的連續0)

  • 編譯期計算:

    • 所有計算都在編譯期完成

    • 運行時無額外開銷

  • 類型安全:

    • 通過 trait bound 確保類型約束

    • 防止非法操作

  1. 示例說明
  • B<B<Null,O>,I> (1) 加一:

    • 最低位是 I,需要進位

    • 對高位 B<Null,O> 加一得到 B<B<Null,O>,I>

    • 最低位置為 O,結果為 B<B<B<Null,O>,I>,O> (2)

  • B<B<Null,I>,O> (-2) 加一:

    • 最低位是 O,直接置為 I

    • 高位為B<Null,I>,低位為I,需要規格化 (-1)

    • 結果規格化為B<B<Null,I>,I>

這個實現展示了如何在 Rust 類型系統中實現數學運算,是類型級編程的典型示例。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89536.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國內Ubuntu訪問不了github、 huggingface等

各位小伙伴們&#xff0c;大家好呀。 大家是不是經常遇到訪問不了github、huggingface的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net&#xff0c; 對于github.com&#xff0c;在這個網站輸入github.com…

「Java EE開發指南」如何用MyEclipse創建企業應用項目?(一)

由于有了項目模型和管理工具&#xff0c;現在可以創建Java EE企業應用程序。在本文中您將了解到&#xff1a; 企業應用項目模型項目組織、依賴關系和類解析 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 1. 企業應用項目模型 MyEclipse提供了一個企業應用程序項…

ubuntu 22.04 pam 模塊設置用戶登錄失敗鎖定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下內容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定時任務全解析:atd 與 crond 的區別及實戰案例(含日志備份 + 時間寫入)

1. atd 和 crond 兩個任務管理程序的區別atd&#xff1a;用于執行一次性的定時任務&#xff0c;即設置任務在某個特定的時間點僅執行一次 &#xff0c;適合處理不需要重復執行的定時操作&#xff0c;比如在未來某個確切時間執行一個腳本、發送一份文件等場景。crond&#xff1a…

iOS加固工具有哪些?項目場景下的組合策略與實戰指南

在如今的iOS項目中&#xff0c;“加固”不僅是單一手段&#xff0c;更是多工具協同應用的過程。不同項目場景對安全要求的側重點不同&#xff0c;需要針對性地組合加固工具&#xff0c;才能最大化兼顧安全性、兼容性與效率。 本文將從常見項目場景出發&#xff0c;分析當下市面…

Xilinx Zynq:一款適用于軟件定義無線電的現代片上系統

摘要——軟件定義無線電可以在通用處理器 (CPU) 上實現&#xff0c;例如基于 PC 的處理器。處理器具有高度靈活性&#xff1a;它不僅可以用來處理數據樣本&#xff0c;還可以控制接收器功能、顯示瀑布圖或運行解調軟件。然而&#xff0c;由于處理速度相對較慢&#xff0c;處理器…

接口黑洞?破!安全堡壘?筑!冰火煉獄?戰!MES7114W終極掌控

在工業4.0加速推進的時代&#xff0c;設備互聯正面臨三大關鍵挑戰&#xff1a;多協議接口的“通信割裂”、極端環境的嚴苛考驗&#xff0c;以及高危場景下的安全紅線。在礦山井下、冶金車間、化工廠區等惡劣環境中&#xff0c;傳統有線方案往往受限于高成本布線、維護困難和環境…

深入理解進程地址空間:虛擬內存與進程獨立性

目錄 引言 虛擬地址空間的本質 關鍵觀察 進程地址空間布局 虛擬內存管理&#xff1a;mm_struct 虛擬內存的優勢 總結 引言 在操作系統中&#xff0c;每個進程都運行在自己的獨立區域中&#xff0c;這個區域就是??進程地址空間??。今天我們就來探討這個看似真實實則虛…

Apache ActiveMQ 任意文件寫入漏洞(CVE-2016-3088)復現利用

漏洞原理 Apache ActiveMQ是Apache軟件基金會所研發的開放源代碼消息中間件&#xff0c;由于ActiveMQ是一個純Java程序&#xff0c;因此只需要操作系統支持Java虛擬機&#xff0c;ActiveMQ便可執行 本漏洞出現在fileserver應用中&#xff0c;漏洞原理其實非常簡單&#xff0c…

谷歌地球與ArcGIS Pro查看三維地形

&#xff08;1&#xff09;Google Earth Web端 通過網站&#xff1a;https://earth.google.com/&#xff0c;進入谷歌地球Web端&#xff0c;可以查看歷史影像、三維地形數據、導入kml文件等。 &#xff08;2&#xff09;ArcGIS Pro查看三維場景 加載3D地形數據&#xff0c;轉…

Day06_C語言網絡編程20250718

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議&#xff1a;我們自己寫的pack_t(無論靜態還是動態)&#xff0c;都是屬于二次封裝的協議modbus協議是一種 “主從問答式…

web開發-HTML

web開發——HTML 學習目標&#xff1a;學習HTML的基礎&#xff0c;學會get和post方法區別 一、HTMLHTML是什么&#xff1f; 前端網頁界面開發語言。開發工具 PyCharm、vscodePyCharm個性化設置&#xff08;字體和背景顏色&#xff09; File - setting - appearance - theme&…

主流編程語言全景圖:從Python到Rust的深度解析

2024年編程語言生態報告顯示&#xff0c;全球開發者使用的語言數量已達260&#xff0c;但真正主導行業的不到20種。本文帶你穿透技術迷霧&#xff0c;掌握8大核心語言的本質差異。一、選擇編程語言的黃金標準圖表代碼二、八大主流語言對比解析1. Python - 通用膠水語言特性&…

若依框架下前后端分離項目交互流程詳解

在企業級前后端分離項目開發中&#xff08;如若依RuoYi&#xff09;&#xff0c;前端與后端的數據交互、安全認證、權限校驗、響應處理都是必須關注的重點。本文將以“課程管理列表查詢”為例&#xff0c;詳細梳理整個交互流程&#xff0c;每一步均有解析說明和典型代碼&#x…

cartorgapher的編譯與運行

目錄 cartorgapher的編譯環境 cartorgapher的編譯 cartographer的運行 參數的詳解與調參總結 降低延遲與減小計算量 cartorgapher的編譯環境 系統環境 推薦在ubuntu16.04或者18.04上進行編譯 推薦使用剛裝好的ubuntu系統 將ubuntu的軟件源設置成清華的或者其他的中國境內的…

淺談車載電控和機器人一體化關節電控區別和聯系

類別車載電機關節電機&#xff08;伺服電機)電機PMSM 有軸 永磁體內嵌IPMPMSM&BLDC 永磁體表貼 SPM&#xff0c;轉速不高&#xff0c;減少體積 關節和推桿用無框力矩電機&#xff1a;只有定子和轉子&#xff0c;無軸&#xff0c;無外殼和端蓋&#xff0c;便于和編碼器減速器…

【數據結構】堆(下)+ 二叉樹

上期回顧&#xff1a;【數據結構】樹&#xff08;堆&#xff09;上 一.堆的應用 1.1堆排序&#xff08;向下調整在上一期&#xff09; 向上調整算法建堆&#xff1a; 首先先回顧一下向上調整算法 void AdjustUP(HPDataType* arr, int child) {int parent (child - 1) / 2…

Elasticsearch MCP 服務器現已在 AWS Marketplace 上提供

作者&#xff1a;來自 Elastic Udayasimha Theepireddy (Uday), Matt Ryan, Srinivas Pendyala 我們很高興地宣布&#xff0c;Elasticsearch Model Context Protocol&#xff08; MCP &#xff09;服務器現已在 AWS Marketplace 上提供。 使用 MCP 將代理連接到 Elasticsearch …

【Linux】Makefile(一)-介紹

Makefile 本篇博客是作者在學習Linux方面知識過程中&#xff0c;對Makefile片面的了解&#xff0c;從而產生了對Makefile有一個全面的認識的想法&#xff0c;在知道《跟我一起寫Makefile》此書后&#xff0c;作者學習閱讀過程中整理出的筆記。 目錄Makefilemakefile介紹:規則&…

Java爬蟲與正則表達式——用正則來爬取數據

APIJava幫我們寫好的各種功能的Java類。這些Java類統稱為API。正則表達式就是API幫我們寫好的類。正則表達式例子&#xff1a; 字符類&#xff1a;[abc]&#xff1a;只能是a&#xff0c;b或c[^abc]&#xff1a;除了a&#xff0c;b&#xff0c;c之外的任何字符[a-zA-Z]&#xff…