【unitrix數間混合計算】3.3 無符號整數標記trait(bin_unsigned.rs)

一、源碼

這段代碼是用 Rust 語言實現的一個類型級無符號二進制整數系統,通過類型系統在編譯時表示和操作二進制數字。這是一種典型的"類型級編程"(type-level programming)技術。

use crate::number::{U0, Bin, Bit, BinInt};/// 無符號二進制整數標記
/// - 包含零和正整數
/// - 底層實現保證數值有效性
pub trait BinUnsigned: BinInt + Copy + Default + 'static{#[allow(missing_docs)] const U8: u8;#[allow(missing_docs)] const U16: u16;#[allow(missing_docs)] const U32: u32;#[allow(missing_docs)] const U64: u64;#[allow(missing_docs)] const U128: u128;#[allow(missing_docs)] const USIZE: usize;#[allow(missing_docs)] const I8: i8;#[allow(missing_docs)] const I16: i16;#[allow(missing_docs)] const I32: i32;#[allow(missing_docs)] const I64: i64;#[allow(missing_docs)] const I128: i128;#[allow(missing_docs)] const ISIZE: isize;#[allow(missing_docs)] fn to_u8() -> u8;#[allow(missing_docs)] fn to_u16() -> u16;#[allow(missing_docs)] fn to_u32() -> u32;#[allow(missing_docs)] fn to_u64() -> u64;#[allow(missing_docs)] fn to_u128() -> u128;#[allow(missing_docs)] fn to_usize() -> usize;#[allow(missing_docs)] fn to_i8() -> i8;#[allow(missing_docs)] fn to_i16() -> i16;#[allow(missing_docs)] fn to_i32() -> i32;#[allow(missing_docs)] fn to_i64() -> i64;#[allow(missing_docs)] fn to_i128() -> i128;#[allow(missing_docs)] fn to_isize() -> isize;
}// 零值實現
impl BinUnsigned for U0 {const U8: u8 = 0;const U16: u16 = 0;const U32: u32 = 0;const U64: u64 = 0;const U128: u128 = 0;const USIZE: usize = 0;const I8: i8 = 0;const I16: i16 = 0;const I32: i32 = 0;const I64: i64 = 0;const I128: i128 = 0;const ISIZE: isize = 0;#[inline] fn to_u8() -> u8 { 0 }#[inline] fn to_u16() -> u16 { 0 }#[inline] fn to_u32() -> u32 { 0 }#[inline] fn to_u64() -> u64 { 0 }#[inline] fn to_u128() -> u128 { 0 }#[inline] fn to_usize() -> usize { 0 }#[inline] fn to_i8() -> i8 { 0 }#[inline] fn to_i16() -> i16 { 0 }#[inline] fn to_i32() -> i32 { 0 }#[inline] fn to_i64() -> i64 { 0 }#[inline] fn to_i128() -> i128 { 0 }#[inline] fn to_isize() -> isize { 0 }
}// 所有正整數都是無符號數
impl<U: BinUnsigned, B: Bit> BinUnsigned for Bin<U, B>
{const U8: u8 = B::U8 | U::U8 << 1;const U16: u16 = B::U8 as u16 | U::U16 << 1;const U32: u32 = B::U8 as u32 | U::U32 << 1;const U64: u64 = B::U8 as u64 | U::U64 << 1;const U128: u128 = B::U8 as u128 | U::U128 << 1;const USIZE: usize = B::U8 as usize | U::USIZE << 1;const I8: i8 = B::U8 as i8 | U::I8 << 1;const I16: i16 = B::U8 as i16 | U::I16 << 1;const I32: i32 = B::U8 as i32 | U::I32 << 1;const I64: i64 = B::U8 as i64 | U::I64 << 1;const I128: i128 = B::U8 as i128 | U::I128 << 1;const ISIZE: isize = B::U8 as isize | U::ISIZE << 1;#[inline] fn to_u8() -> u8 { B::to_u8() | U::to_u8() << 1}#[inline] fn to_u16() -> u16 { u16::from(B::to_u8()) | U::to_u16() << 1}#[inline]fn to_u32() -> u32 {u32::from(B::to_u8()) | U::to_u32() << 1}#[inline]fn to_u64() -> u64 {u64::from(B::to_u8()) | U::to_u64() << 1}#[inline]fn to_u128() -> u128 {u128::from(B::to_u8()) | U::to_u128() << 1}#[inline]fn to_usize() -> usize {usize::from(B::to_u8()) | U::to_usize() << 1}#[inline]fn to_i8() -> i8 {B::to_u8() as i8 | U::to_i8() << 1}#[inline]fn to_i16() -> i16 {i16::from(B::to_u8()) | U::to_i16() << 1}#[inline]fn to_i32() -> i32 {i32::from(B::to_u8()) | U::to_i32() << 1}#[inline]fn to_i64() -> i64 {i64::from(B::to_u8()) | U::to_i64() << 1}#[inline]fn to_i128() -> i128 {i128::from(B::to_u8()) | U::to_i128() << 1}#[inline]fn to_isize() -> isize {B::to_u8() as isize | U::to_isize() << 1}
}

二、核心概念

  1. 基礎類型
  • U0: 表示數字 0 的類型

  • Bit: 表示單個比特(0 或 1)的 trait

  • Bin<U, B>: 表示二進制數字的泛型類型,其中:

    • U 是高位部分(也是 BinUnsigned 類型)

    • B 是最低位比特(Bit 類型)

  1. BinUnsigned Trait

這是一個標記 trait,定義了無符號二進制整數需要實現的功能:


// 數字 5 的二進制表示:101
// 在類型系統中表示為:Bin<Bin<Bin<U0, B1>, B0>, B1>

三、實現細節

  1. 零的實現 (U0)
  • 所有常量都返回 0

  • 所有轉換方法都返回 0

  1. 正整數的實現 (Bin<U, B>)

核心算法是二進制數的遞歸構造:


// 對于 Bin<U, B> 表示的數字,其值為:= (U 的值 × 2) + B 的值

具體實現:

  • U8/U16/…:編譯時常量,通過位運算計算

  • to_u8()/to_u16()/…:運行時方法,同樣通過位運算計算

四、技術特點

  1. 編譯時計算:使用 const 常量在編譯時完成數值計算

  2. 零成本抽象:運行時沒有額外開銷,所有信息在編譯期確定

  3. 類型安全:通過類型系統保證數值的有效性

  4. 遞歸結構:使用遞歸類型定義表示任意長度的二進制數

五、使用示例


// 假設有具體的 Bit 實現 B0(0) 和 B1(1)
// 數字 5 (二進制 101) 的類型表示:
type Five = Bin<Bin<Bin<U0, B1>, B0>, B1>;assert_eq!(Five::U8, 5);
assert_eq!(Five::to_u8(), 5);

六、應用場景

這種技術常用于:

  • 嵌入式系統的類型安全配置

  • 需要編譯時數值驗證的場景

  • 元編程和領域特定語言(DSL)

  • 學術研究中的類型系統探索

這是一種高級的 Rust 編程技術,展示了 Rust 強大的類型系統和編譯時計算能力。

七、原計劃的問題

// 原計劃:BinPos -> BinUnsigned (包含0和正數)
// 但出現了遞歸調用錯誤,因為:
trait BinPos: BinUnsigned + NonZero {}  // 循環依賴問題

八、現設計的優勢

  1. trait 分工明確

// 現在清晰的職責劃分:
trait BinUnsigned: BinInt + Copy + Default  // 所有無符號數(包含0)
trait NonZero  // 標記 trait,排除零值// 組合使用:BinUnsigned + NonZero = 正整數
  1. 避免遞歸依賴

// 不再需要 BinPos 繼承 BinUnsigned
// 而是通過 trait 組合實現相同效果
fn process_positive<T: BinUnsigned + NonZero>(num: T) {// 這里 T 一定是正整數
}
  1. 編譯檢查友好

// 編譯器可以更好地處理這種扁平化的 trait 層次
// 沒有復雜的繼承鏈,減少編譯錯誤
  1. 更好的靈活性

// 可以單獨使用任意 trait 組合:
fn process_any<T: BinUnsigned>(num: T)     // 接受0和正數
fn process_nonzero<T: NonZero>(num: T)     // 接受任何非零類型
fn process_positive<T: BinUnsigned + NonZero>(num: T) // 只接受正整數

九 新舊實現對比

現設計相比原始設計的改進:

方面原設計改進設計
trait 層次復雜的繼承鏈扁平化組合
編譯錯誤容易遞歸錯誤更少編譯問題
擴展性修改困難易于擴展
代碼清晰度相對復雜職責分明

實際應用示例


// 定義具體的非零標記
struct NonZeroMarker;// 為正整數類型實現 NonZero
impl<U: BinUnsigned, B: Bit> NonZero for Bin<U, B> {}// 使用示例
fn safe_division<T: BinUnsigned + NonZero, U: BinUnsigned
>(numerator: U, denominator: T) -> Result<U, DivisionByZero> {// 編譯時確保分母不為零Ok(divide(numerator, denominator))
}

十、總結

目前設計決策體現了很好的工程思維:

  1. 解決實際問題:通過 trait 組合避免遞歸依賴

  2. 保持簡潔性:去除不必要的中間 trait

  3. 增強可用性:明確的職責分離讓代碼更易理解

  4. 兼容性考慮:與現有 Rust 的 NonZero 概念保持一致

這種設計既解決了技術問題,又提供了更好的開發體驗,是一個很優秀的重構方案。

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

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

相關文章

Python基本語法總結

1.類&#xff08;Class&#xff09;在Python中類&#xff08;Class&#xff09;是面向對象編程&#xff08;OOP&#xff09;的核心概念。1.1.類的基本定義最簡單的類class Cat:"""這是一個最簡單的類"""pass #創建實例 obj Cat()包含方法的類cl…

數據結構05(Java)-- ( 歸并排序實質,歸并排序擴展問題:小和問題)

前言 本文為本小白&#x1f92f;學習數據結構的筆記&#xff0c;將以算法題為導向&#xff0c;向大家更清晰的介紹數據結構相關知識&#xff08;算法題都出自&#x1f64c;B站馬士兵教育——左老師的課程&#xff0c;講的很好&#xff0c;對于想入門刷題的人很有幫助&#x1f4…

稅務專業人員能力構建與發展路徑指南

CDA數據分析師證書含金量高&#xff0c;適應了未來數字化經濟和AI發展趨勢&#xff0c;難度不高&#xff0c;行業認可度高&#xff0c;對于找工作很有幫助。一、稅務專業人員的核心能力框架能力維度關鍵技能要素專業工具與方法論實踐輸出成果稅務法規應用稅種政策解讀、法規更新…

Linux中rsync使用與inotify實時同步配置指南

Linux中rsync使用與inotify實時同步配置指南 一、rsync 簡介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系統下的一款高效數據鏡像和備份工具&#xff0c;用于在本地或遠程同步文件和目錄。 支持本地復制、基于 SSH 的遠程同步&#xff0c;以及使用自有 rsync 協議的同…

Unicode 字符串轉 UTF-8 編碼算法剖析

&#x1f4ca; Unicode 字符串轉 UTF-8 編碼算法剖析 ——從 C# char 到 C wchar_t 的編碼轉換原理 引用&#xff1a;UTF-8 編解碼可視化分析 &#x1f50d; 1. 算法功能概述 該函數將 Unicode 字符串&#xff08;C# string&#xff09;轉換為 UTF-8 編碼的字節數組&#xf…

php的安全性到底怎么樣

PHP作為一種流行的服務器端腳本語言&#xff0c;被廣泛應用于Web開發。然而&#xff0c;由于PHP是一種較為靈活的語言&#xff0c;其安全性議題一直備受爭議。在這篇文章中&#xff0c;我將從多個方面來討論PHP的安全性&#xff0c;包括常見的安全漏洞、防范措施以及最佳實踐。…

mapbox高階,結合threejs(threebox)添加建筑glb模型,添加陰影效果,設置陰影顏色和透明度

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言 1.1 ??mapboxgl.Map 地圖對象 1.2 ??mapboxgl.Map style屬性 1.3 ??threebox loadObj加載模型 二、??…

SSM從入門到實戰:1.6 Spring數據訪問與JDBC模板

&#x1f44b; 大家好&#xff0c;我是 阿問學長&#xff01;專注于分享優質開源項目解析、畢業設計項目指導支持、幼小初高的教輔資料推薦等&#xff0c;歡迎關注交流&#xff01;&#x1f680; 06-Spring數據訪問與JDBC模板 &#x1f4d6; 本文概述 本文是SSM框架系列Spri…

下一代IT服務管理:ITIL5會是什么樣?

ITIL4發布到現在也就5年多時間&#xff0c;按照以往的更新節奏&#xff0c;ITIL5最早也得2027年之后。但現在IT發展的速度&#xff0c;跟以前完全不是一個量級。AI都快把我們的飯碗搶了&#xff08;開個玩笑&#xff09;&#xff0c;ITIL要是還按部就班&#xff0c;估計真要被時…

最新研究進展:2023-2025年神經機器翻譯突破性成果

文章目錄 一、模型架構創新 1.1 混合架構的崛起 1.2 多模態翻譯的突破 1.3 大語言模型與NMT的深度融合(2023-2024) 1.4 非自回歸翻譯(NAT)的效率革命(2024) 二、數據與訓練策略優化 2.1 低資源語言翻譯的飛躍 2.2 動態數據增強技術 三、效率與部署 3.1 模型壓縮與加速 3.…

OpenTelemetry WebSocket 監控終極方案:打通最后一公里

概述 OpenTelemetry&#xff0c;以下簡稱 OTEL&#xff0c;是由 CNCF 托管的“一站式可觀測性標準”&#xff0c;把指標、鏈路、日志三大信號統一為單一 SDK/API&#xff0c;零侵入地采集從瀏覽器、移動端到后端、容器、云服務的全棧遙測數據&#xff0c;并支持 40 后端一鍵導…

VS Code 出現的 Web 視圖加載錯誤和服務工作者注冊失敗問題解決方案

針對 VS Code 或 Cursor &#xff08;vscode系&#xff09;中出現的 Web 視圖加載錯誤和服務工作者注冊失敗問題&#xff0c;以下是永久性解決方案的完整操作指南&#xff1a;解決方案步驟打開命令面板 使用快捷鍵 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShift…

【qml-4】qml與c++交互(類型多例)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例注入&#xff09; 【qml-2】嘗試一個有模式的qml彈窗 【qml-3】qml與c交互第二次嘗試&#xff08;類型注冊&#xff09; 【qml-4】qml與c交互&#xff08;類型多例&#xff09; 【qml-5】qml與c交互&#…

圖數據庫如何構筑 Web3 風控防線 聚焦批量注冊與鏈上盜轉 悅數圖數據庫

隨著 Web3 生態的不斷演進&#xff0c;鏈上風險呈現出團伙化、隱蔽化和動態化的趨勢&#xff0c;傳統的單點風控手段已難以應對復雜多變的攻擊模式。尤其在批量注冊薅羊毛與鏈上交易盜轉洗錢等高頻風險場景中&#xff0c;攻擊者往往通過偽造身份、跨鏈操作、多層嵌套轉賬等方式…

恒流源電路學習

恒流源的設計原理&#xff1a; 如圖所示你可以看到右邊的的推到公式得到紅點處的電壓是一個和左邊相關的定值&#xff0c;所以呢右邊的電流就是電壓除以那個4Ω&#xff0c;所以得到右邊的電路的電流大體是一個定值&#xff0c;不管你再加什么東西都可以保持這個電流&#xff…

基于生成對抗網絡的模糊圖像恢復原理與技術實現

1. 引言圖像模糊是數字圖像處理中的常見問題&#xff0c;其成因包括相機抖動、物體運動、聚焦不良等。傳統方法如維納濾波、Lucy-Richardson 算法等依賴于模糊核估計和逆濾波&#xff0c;在復雜場景下性能有限。生成對抗網絡&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 變更修復

FE 恢復 異常日志 查看 fe.out 會有以下報錯&#xff0c;此時 fe 進程是無法啟動的&#xff0c;操作前注意備份所有 fe 的元數據并停止上游讀寫動作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系統應用收不到開機廣播

安卓14系統應用收不到開機廣播 - Wesley’s Blog 前段時間有測試反饋在安卓14 上面某系統應用恢復出廠設置后沒有自啟動&#xff0c;究竟是什么原因呢&#xff1f; 回顧 Android 從3.1開始&#xff0c;會將新安裝并且從未被啟動的應用置為“STOPPED”狀態&#xff0c;或者被…

C# Attribute 方法擴展

場景 剛寫完一個干凈利落的方法&#xff0c;比如保存數據到數據庫&#xff0c;邏輯清晰、結構優雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完數據&#xff0c;記得給客戶發個郵件哦~” 第三天&#xff0c;“能不能再發個消息通知其他系統&#xff1f;” 第四天&am…

【URP】[法線貼圖]為什么主要是藍色的?

【從UnityURP開始探索游戲渲染】專欄-直達 法線貼圖呈現藍紫色調&#xff08;尤其以藍色為主&#xff09;是由其?存儲原理、切線空間坐標系設計及顏色編碼規則共同決定的?。 核心原因&#xff1a;法線向量的存儲規則? ?法線向量的物理范圍? 法線是單位向量&#xff0c;…