【typenum】 28 數組長度和二進制數的位數(Len)

一、源碼

這段代碼實現了一個類型級別的長度計算系統,用于在編譯時計算數組長度和二進制數的位數。

  1. 定義(type_operators.rs)
/// A **type operator** that gives the length of an `Array` or the number of bits in a `UInt`.
#[allow(clippy::len_without_is_empty)]
pub trait Len {/// The length as a type-level unsigned integer.type Output: crate::Unsigned;/// This function isn't used in this crate, but may be useful for others.fn len(&self) -> Self::Output;
}
  1. 別名(operator_aliases.rs)
/// Alias for the associated type of `Len`: `Length<A> = <A as Len>::Output`
pub type Length<T> = <T as Len>::Output;
  1. 無符號整數實現(uint.rs)
// ---------------------------------------------------------------------------------------
// Getting length of unsigned integers, which is defined as the number of bits before `UTerm`/// Length of `UTerm` by itself is 0
impl Len for UTerm {type Output = U0;#[inline]fn len(&self) -> Self::Output {UTerm}
}/// Length of a bit is 1
impl<U: Unsigned, B: Bit> Len for UInt<U, B>
whereU: Len,Length<U>: Add<B1>,Add1<Length<U>>: Unsigned,
{type Output = Add1<Length<U>>;#[inline]fn len(&self) -> Self::Output {self.msb.len() + B1}
}
  1. 數組實現(array.rs)
// Length/// Length of `ATerm` by itself is 0
impl Len for ATerm {type Output = U0;#[inline]fn len(&self) -> Self::Output {UTerm}
}/// Size of a `TypeArray`
impl<V, A> Len for TArr<V, A>
whereA: Len,Length<A>: Add<B1>,Sum<Length<A>, B1>: Unsigned,
{type Output = Add1<Length<A>>;#[inline]fn len(&self) -> Self::Output {self.rest.len() + B1}
}

二、Len Trait 定義


pub trait Len {type Output: crate::Unsigned;  // 輸出類型必須是Unsignedfn len(&self) -> Self::Output; // 運行時獲取長度的方法
}
  • 類型級操作符: 在編譯時計算長度

  • Output: 關聯類型,表示長度的類型(必須是Unsigned類型)

  • len(): 運行時方法,實際返回類型級別的長度值

三、類型別名


pub type Length<T> = <T as Len>::Output;
  • 簡化訪問: 提供更簡潔的方式來獲取類型的長度類型

  • 用法: Length 等價于 ::Output

四、無符號整數實現(計算二進制位數)

  1. UTerm(終止符)的實現

impl Len for UTerm {type Output = U0;  // 長度為0fn len(&self) -> Self::Output {UTerm  // 返回UTerm(即U0)}
}
  • 基準情況: 終止符的長度為0

  • UTerm 表示二進制數的結束,沒有位數

  1. UInt(二進制位)的實現

impl<U: Unsigned, B: Bit> Len for UInt<U, B>
whereU: Len,                    // 剩余部分必須有長度Length<U>: Add<B1>,        // 剩余長度+1必須可計算Add1<Length<U>>: Unsigned, // 結果必須是Unsigned類型
{type Output = Add1<Length<U>>; // 長度 = 剩余長度 + 1fn len(&self) -> Self::Output {self.msb.len() + B1  // 遞歸計算}
}
  • 遞歸計算: 當前UInt的長度 = 剩余部分長度 + 1

  • self.msb: 剩余的高位部分

  • B1: 類型級別的數字1

  • Add1<Length>: 類型級別的加法 Length + 1

示例: 計算 UInt<UInt<UTerm, B1>, B0> (二進制10,即數字2) 的長度:

  • 第一層:UInt<UInt<UTerm, B1>, B0> → Length<UInt<UTerm, B1>> + 1

  • 第二層:UInt<UTerm, B1> → Length + 1 = 0 + 1 = 1

  • 結果:1 + 1 = 2 位

五、數組實現(計算元素個數)

  1. ATerm(數組終止符)的實現

impl Len for ATerm {type Output = U0;  // 長度為0fn len(&self) -> Self::Output {UTerm}
}
  • 基準情況: 空數組的長度為0

  • ATerm 表示數組的結束

  1. TArr(類型數組)的實現

impl<V, A> Len for TArr<V, A>
whereA: Len,                    // 剩余數組必須有長度Length<A>: Add<B1>,        // 剩余長度+1必須可計算Sum<Length<A>, B1>: Unsigned, // 結果必須是Unsigned類型
{type Output = Add1<Length<A>>; // 長度 = 剩余數組長度 + 1fn len(&self) -> Self::Output {self.rest.len() + B1  // 遞歸計算}
}
  • 遞歸計算: 當前數組長度 = 剩余數組長度 + 1

  • self.rest: 數組中剩余的元素

  • 示例: 數組 [i32, f64, bool] 的長度計算:

    • 第一層:TArr<i32, TArr<f64, TArr<bool, ATerm>>> → Length<TArr<f64, TArr<bool, ATerm>>> + 1

    • 第二層:TArr<f64, TArr<bool, ATerm>> → Length<TArr<bool, ATerm>> + 1

    • 第三層:TArr<bool, ATerm> → Length + 1 = 0 + 1 = 1

    • 結果:1 + 1 + 1 = 3 個元素

六、設計特點

  • 類型安全: 所有計算在編譯時完成,保證類型正確性

  • 遞歸模式: 使用遞歸遍歷數據結構

  • 統一接口: 數組和二進制數使用相同的Len trait

  • 零成本抽象: 運行時沒有額外開銷,所有信息在編譯時已知

這種模式常用于需要編譯時計算的場景,如靜態數組邊界檢查、類型級別的數學運算等。

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

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

相關文章

【Docker項目實戰】使用Docker部署Hibiscus.txt簡單日記工具

【Docker項目實戰】使用Docker部署Hibiscus.txt簡單日記工具一、Hibiscus介紹1.1 Hibiscus簡介1.2 主要特點二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本四、拉取鏡像五、部署Hibis…

openharmony之啟動恢復子系統詳解

OpenHarmony的啟動恢復子系統負責整個系統的啟動流程&#xff0c;其中init進程是整個系統啟動的第一個用戶態進程&#xff08;PID1&#xff09;&#xff0c;承擔著系統初始化的核心職責 &#x1f3af; 目錄結構 &#x1f4cb; 理論基礎&#x1f50d; 源碼結構分析?? 配置體系…

Jenkins + SonarQube 從原理到實戰四:Jenkins 與 Gerrit 集成并實現自動任務

前言 前面我們已經部署了 SonarQube&#xff0c;并加入了 sonar-cxx 插件&#xff0c;實現了 C/C 代碼掃描&#xff0c;同時打通了 Windows AD 域&#xff0c;實現了 AD 用戶登錄與權限管控。 原計劃本篇&#xff08;第四篇&#xff09;完成 Jenkins Gerrit Sonar 的 CI 部分…

基于Spring Boot與Redis的電商場景面試問答解析

基于Spring Boot與Redis的電商場景面試問答解析 第一輪&#xff1a;基礎問題 面試官&#xff1a; 你好小C&#xff0c;今天我們以電商場景為背景進行技術面試。第一個問題&#xff0c;解釋一下Spring Boot的核心優勢是什么&#xff1f; 小C&#xff1a; Spring Boot就是開箱即用…

CUDA安裝,pytorch庫安裝

一、CUDA安裝 1.查看自己電腦適配的CUDA的最高版本 在命令提示符里輸入nvidia-smi表格右上角顯示的CUDA版本是該電腦適配的最高版本一般下載比該版本低一點的版本&#xff0c;因為會更穩定 由于本機沒有GPU所以會出現這個報錯&#xff0c;如果有GPU會出現如下報告&#xff1a…

力扣 第 463 場周賽

1. 按策略買賣股票的最佳時機 給你兩個整數數組 prices 和 strategy&#xff0c;其中&#xff1a; prices[i] 表示第 i 天某股票的價格。 strategy[i] 表示第 i 天的交易策略&#xff0c;其中&#xff1a; -1 表示買入一單位股票。 0 表示持有股票。 1 表示賣出一單位股票。 同…

Matplotlib 可視化大師系列(六):plt.imshow() - 繪制矩陣與圖像的強大工具

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列&#xff08;六&#xff09;&#xff1a;plt.imshow() - 繪制矩陣與圖像的強大工具一、 plt.imshow() 是什么&#xff1f;何時使用&#xff1f;二、 函數原型與核心參數三、 從入門到精通&#xff1a;代碼示例示…

小游戲AssetBundle加密方案解析

據游戲工委數據統計&#xff0c;2025年1-6月&#xff0c;國內小程序游戲市場實際銷售收入232.76億元&#xff0c;同比增長40.2%。其中內購產生收入153.03億元&#xff0c;占比65.7%&#xff0c;呈逐年提升趨勢。爆款頻出的小游戲&#xff0c;已經成為當下游戲行業的重要增長點。…

linux編程----網絡通信(TCP)

1.TCP特點1.面向數據流&#xff1b;2.有連接通信&#xff1b;3.安全可靠的通信方式&#xff1b;4.機制復雜&#xff0c;網絡資源開銷大&#xff1b;5.本質只能實現一對一的通信&#xff08;可使用TCP的并發方式實現一對多通信&#xff09;&#xff1b;2.TCP的三次握手與四次揮手…

HTTP請求的執行流程

HTTP請求的執行流程是一個系統化的過程&#xff0c;涉及多個網絡協議和交互步驟。以下是完整的流程分解&#xff0c;結合關鍵技術和邏輯順序&#xff1a;&#x1f310; 一、連接準備階段??URL解析與初始化??客戶端&#xff08;瀏覽器/應用&#xff09;解析目標URL&#xff…

聯想win11筆記本音頻失效,顯示差號(x)

該博客可以解答 常見問題詳情 Win10系統安裝更新后右下角聲音出現紅叉&#xff0c;電腦也沒有聲音&#xff0c; 通過設備管理器查看“系統設備”發現“音頻部分“出現黃色感嘆號&#xff0c; 更新驅動、卸載驅動與第三方工具檢測安裝后重啟都不行。 故障原因 應該是用戶曾經…

elasticsearch 7.x elasticsearch 使用scroll滾動查詢中超時問題案例

一 問題 1.1 問題描述 2025-08-21 16:57:53.646 | WARN ||||||||||||| scheduling-1 | ElasticsearchRestTemplate | Could not clear scroll: Unable to parse response body; nested exception is ElasticsearchStatusException [Unable to parse response body]; nested: …

高并發內存池(1)-定長內存池

高并發內存池&#xff08;1&#xff09;-定長內存池 可以采用兩種方式&#xff1a; 方式1&#xff1a; template <size_t N>方式2&#xff1a; template <class T>獲取到T對象大小的內存池&#xff0c;更推薦使用方式二&#xff0c;因為可以動態靈活調整類型 需要的…

第三階段sql server數據-4:數據庫腳本生成,備份與還原,分離與附加操作的圖文步驟

1_生成數據庫腳本&#xff08;1&#xff09;在數據庫上右鍵選擇任務&#xff08;2&#xff09;選擇生成腳本&#xff08;3&#xff09;選擇下一步&#xff0c;如果下次不想顯示此頁面&#xff0c;可勾選不再顯示此頁&#xff08;4&#xff09;如果導出全部數據&#xff0c;選擇…

【C++闖關筆記】STL:string的學習和使用(萬字精講)

?系列文章目錄 第零篇&#xff1a;從C到C入門&#xff1a;C有而C語言沒有的基礎知識總結-CSDN博客 第一篇&#xff1a;【C闖關筆記】封裝①&#xff1a;類與對象-CSDN博客 第二篇&#xff1a;【C闖關筆記】封裝②&#xff1a;友元與模板-CSDN博客 第三篇&#xff1a;【C闖…

06 - spring security角色和權限設置

spring security角色和權限設置 文檔 00 - spring security框架使用01 - spring security自定義登錄頁面02 - spring security基于配置文件及內存的賬號密碼03 - spring security自定義登出頁面04 - spring security關閉csrf攻擊防御05 - spring security權限控制 角色和權限…

如何實現文檔處理全流程自動化?

在處理文本文檔、電子郵件、視頻音頻、社媒帖子等非結構化數據時&#xff0c;我們經常發現這些數據難以用傳統的數據庫表格進行存儲和管理&#xff0c;因為其沒有明確的結構和標準化的格式&#xff0c;因此&#xff0c;這類數據處理難度較大&#xff0c;當傳統“人眼Excel”模式…

Java Main無法初始化主類的原因與解決方法(VsCode工具)

個人操作 由于上傳git將target目錄也上傳了所以在本地刪除target之后再重新同步更新動作然后直接在vscode工具上run本地項目運行報錯&#xff0c;報錯信息如下 報錯信息分析原因1. 工具配置 用 VS Code 的“Run”運行按鈕時&#xff0c;是否會自動編譯&#xff0c;取決于你的 V…

Azure Kubernetes Service (AKS)

Overview AKS&#xff08;Azure Kubernetes Service&#xff09; 是 Microsoft Azure 提供的一種托管Kubernetes 服務&#xff0c;旨在簡化 Kubernetes 集群的部署、管理和操作。輕松運行和擴展基于容器的應用程序&#xff0c;而無需管理 Kubernetes 本身的基礎設施。 AKS與 …

基于SpringBoot的校園信息共享系統【2026最新】

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…