【unitrix】 4.20 類型級二進制數減法實現解析(sub.rs)

一、源碼

這段代碼實現了一個用于統計二進制補碼整數位數的系統,支持多種自定義數值類型(Z0、P1、N1、B0、B1)。

use core::mem::size_of;
use crate::number::{Z0, P1, N1, B0, B1, Var};/// 統計二進制位數的 trait
pub trait BitLength {fn bit_length(self) -> usize;
}// 基本類型實現
impl BitLength for Z0 {fn bit_length(self) -> usize { 0 }  // Z0 不算位數
}impl BitLength for P1 {fn bit_length(self) -> usize { 1 }  // P1 = +1 (1位)
}impl BitLength for N1 {fn bit_length(self) -> usize { 1 }  // N1 = -1 (1位)
}/// B0<H> 的位數 = 1 (當前位) + H 的位數
impl<H> BitLength for B0<H>
whereH: BitLength,
{fn bit_length(self) -> usize {1 + self.0.bit_length()  // 遞歸調用(運行時,不會觸發編譯器遞歸檢查)}
}/// B1<H> 的位數 = 1 (當前位) + H 的位數
impl<H> BitLength for B1<H>
whereH: BitLength,
{fn bit_length(self) -> usize {1 + self.0.bit_length()  // 遞歸調用(運行時)}
}/// 檢查位數是否超過 Var<T> 的 T 的位數限制
pub fn check_bit_length<T>(value: impl BitLength) -> bool
whereT: PrimitiveInt,  // 假設 Primitive 是整數類型(如 i32, i64)
{let max_bits = size_of::<T>() * 8;  // 如 i32 = 32 位value.bit_length() <= max_bits
}

二、核心設計

  1. 類型定義
  • Z0:表示數值0(0位)

  • P1:表示+1(1位)

  • N1:表示-1(1位)

  • B0/B1:遞歸結構,表示二進制補碼的高位部分

  1. 關鍵Trait

pub trait BitLength {fn bit_length(self) -> usize;  // 按值消費self
}
  • 所有數值類型必須實現該trait來計算自身位數

  • 按值傳遞(self而非&self)要求類型必須實現Copy或調用時轉移所有權

三、位數計算規則

  1. 基本類型
類型位數解釋
Z00數值0不占有效位
P11二進制1(+1)
N11二進制1(-1的補碼)
  1. 復合類型
  • B0<H>:當前位0 + 高位位數

1 + self.0.bit_length()
  • B1<H>:當前位1 + 高位位數
1 + self.0.bit_length()

四、邊界檢查函數


pub fn check_bit_length<T>(value: impl BitLength) -> bool
whereT: PrimitiveInt,
{let max_bits = size_of::<T>() * 8;  // 計算T類型的位數容量value.bit_length() <= max_bits     // 比較實際位數
}
  • 功能:檢查數值的位數是否不超過Var中T的位數限制

  • 示例:

let num = B0(B1(P1)); // 二進制01(十進制+1,2位)assert!(check_bit_length::<i32>(num)); // 檢查是否適合i32(32位)

五、關鍵實現細節

  1. 遞歸解析
  • B0<B1>的解析過程:

    +B0.bit_length() → 1 + B1.bit_length()

    • B1.bit_length() → 1 + P1.bit_length()

    • P1.bit_length() → 1

    • 最終結果:1 + 1 + 1 = 3位

  1. 所有權處理
  • 所有方法使用self而非&self,意味著:

    • 類型應實現Copy(如#[derive(Copy, Clone)])

    • 或調用時轉移所有權(適合一次性使用的場景)

  1. 泛型約束

impl<H> BitLength for B0<H> where H: BitLength
  • 確保嵌套類型H也必須實現BitLength

六、使用示例


// 定義結構體(需實現Copy)
#[derive(Copy, Clone)]
struct P1;// 計算B0(B1(P1))的位數
let num = B0(B1(P1));
assert_eq!(num.bit_length(), 3);// 檢查是否適合i8
assert!(check_bit_length::<i8>(num)); // 3 <= 8

七、潛在問題與改進

  1. 遞歸深度
  • 問題:極深嵌套(如B0<B0<B0<…>>>)可能導致棧溢出

  • 改進:改為迭代實現(如用while let循環遍歷結構)

  1. 類型限制
  • 要求:所有類型必須實現Copy或允許所有權轉移

  • 替代方案:改用&self避免所有權問題

fn bit_length(&self) -> usize;

八、總結

該代碼實現了一個類型安全的二進制位數統計系統:

  • 通過trait統一接口:所有數值類型實現BitLength

  • 遞歸計算位數:B0/B1遞歸組合子類型位數

  • 邊界檢查:驗證數值是否適合目標整數類型(如i32)

  • 零成本抽象:編譯期確定調用方式,無運行時開銷

適用于需要精確控制二進制位數的場景(如硬件寄存器操作、定點數運算等)。

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

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

相關文章

手把手教你安全刪除Anaconda虛擬環境(避坑指南)

文章目錄一、刪除前必看清單&#xff08;超級重要&#xff09;二、三種刪除方法對比&#xff08;建議收藏&#xff09;方法1&#xff1a;官方推薦命令&#xff08;最安全&#xff09;方法2&#xff1a;暴力刪除大法&#xff08;快速但需謹慎&#xff09;方法3&#xff1a;核彈級…

Effective Modern C++ 條款7:區分使用 `()` 和 `{}` 創建對象

在 C11 及以后的版本中&#xff0c;初始化對象的方式變得更加靈活&#xff0c;但也帶來了選擇上的困惑。() 和 {} 是兩種常見的初始化語法&#xff0c;它們在語義、行為和適用場景上有顯著差異。本文將通過具體示例&#xff0c;深入解析這兩種初始化方式的區別&#xff0c;并探…

Java基礎-String常用的方法

String常用的三種構造方法 public static void main(String[] args) {//1.使用常量字符串構造String s1 "1.Hello world";System.out.println(s1);//2.使用new關鍵字構造String s2 new String("2.Hello world");System.out.println(s2);//3。使用字符數組…

數學建模:多目標規劃:ε約束法、 理想點法

一、ε約束法定義ε約束法通過將部分目標函數轉化為約束條件&#xff0c;保留一個主要目標進行優化。1、選擇一個主要目標 fk?(x) 進行優化。2、其他目標 fi?(x) 轉化為約束 fi?(x)≤εi?&#xff0c;其中 εi? 是決策者設定的容許閾值。??原理????目標選擇??&…

linux kernel struct regmap_config結構詳解

在 Linux 內核中&#xff0c;struct regmap_config 是 ?Regmap 子系統的核心配置結構體&#xff0c;用于定義如何與底層硬件寄存器進行交互。Regmap&#xff08;Register Map&#xff09;子系統通過抽象不同總線&#xff08;如 I2C、SPI、MMIO 等&#xff09;的寄存器訪問細節…

【Python3教程】Python3高級篇之CGI編程

博主介紹:?全網粉絲23W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

docker安裝Consul筆記

安裝過程 詳細步驟如下&#xff1a; 首先拉取Consul的Docker鏡像&#xff1a; docker pull hashicorp/consul:1.18.1創建Consul的配置文件和數據目錄&#xff1a; mkdir -p /srv/docker/consul/data mkdir -p /srv/docker/consul/config在config目錄下創建一個config.json配置文…

.net數據脫敏

.NET數據脫敏技術&#xff1a;保障數據安全的有效手段 在當今數字化時代&#xff0c;數據安全至關重要。尤其是涉及到用戶的敏感信息&#xff0c;如密碼、手機號碼等&#xff0c;必須采取有效的措施進行保護。數據脫敏就是這樣一種技術&#xff0c;它能夠在不影響數據可用性的…

【openp2p】 學習2:源碼閱讀P2PNetwork和P2PTunnel

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目已經做了初步分析。閱讀原版工程,感覺工程是一個暴露內網服務端口,讓外部可以用的一個實現是一個完整的、跨平臺的可商業化的應用。感謝作者需要學習作者的設計思路工程構建 F:\GolandProjects\openp2p\core\p2pnetwork.go通常…

網安學習NO.14

防火墻基礎實驗 傳統防火墻配置實驗拓撲圖PC&#xff1a; ip 192.168.10.1 255.255.255.0 192.168.10.254 ip dns 114.114.114.114二層交換機 vl 10 ex int e0/0 sw mo ac sw ac vl 10 ex inr e0/1 sw tr en do sw mo tr三層交換機 vl 10 ex int g0/0 sw tr en do sw mo tr ex …

ESP32語音喚醒

兩種喚醒方式AfeWakeWord與EspWakeWord對比 底層技術 AfeWakeWord&#xff1a;基于ESP-IDF的AFE框架&#xff08;esp_afe_sr_iface_t&#xff09;&#xff0c;高性能模式&#xff08;AFE_MODE_HIGH_PERF&#xff09;EspWakeWord&#xff1a;基于WakeNet接口&#xff08;esp_wn_…

借助 Wisdom SSH AI 助手,輕松安裝 CentOS 8 LNMP 環境

打開Wisdom SSH軟件&#xff0c;在AI對話區輸入“在CentOS 8服務器安裝LNMP環境”&#xff0c;AI助手會按以下步驟分析并執行安裝&#xff1a; 安裝Nginx 分析&#xff1a;CentOS 8默認軟件源可能沒有Nginx&#xff0c;所以要先啟用Nginx官方軟件源&#xff0c;然后才能安裝Ngi…

WD0407 40V 7A 超級肖特基二極管,應用于開關汽車工業控制

WD0407 40V 7A 超級肖特基二極管說明? 產品概述? WD0407 是一款性能卓越的超級肖特基二極管&#xff0c;專為滿足現代電子設備對高效、可靠電源管理的需求而設計。它采用先進的半導體制造工藝&#xff0c;在諸多關鍵性能指標上表現出色&#xff0c;能夠為各類電路提供穩定、高…

盧比危機下的金融破局:科倫坡交易所技術升級作戰圖

&#x1f30f; 今日南亞風暴眼 印度雙重上市機制加速落地&#xff1a;印度國家證券國際交易所&#xff08;NSE IX&#xff09;與科倫坡證券交易所&#xff08;CSE&#xff09;達成技術對接協議&#xff0c;斯企可通過印度GIFT City吸引美元資本&#xff0c;交易時段覆蓋全球22小…

upload-labs靶場通關詳解:第20關 /.繞過

一、分析源代碼// 初始化上傳狀態標記&#xff0c;默認為false&#xff0c;即文件未上傳 $is_upload false; // 初始化消息變量&#xff0c;用于存儲錯誤信息 $msg null;// 檢查是否通過POST方式提交了表單&#xff08;點擊上傳按鈕&#xff09; if (isset($_POST[submit])) …

企業用云狀態評估

云部署形態及其策略規劃成熟度 單云部署&#xff1a; 主要業務負載運行在單一公有云或私有云上 多云/混合云部署 —有清晰戰略規劃與實施&#xff1a; 業務負載運行在多個云&#xff08;公有云或混合云&#xff09;上&#xff0c;并且企業擁有清晰的多云/混合云戰略規劃&#x…

STM32G473串口通信-USART/UART配置和清除串口寄存器狀態的注意事項

USART和UART配置的區別 如果USART使用的是異步通信&#xff0c;那么UART與USART配置基本相同。 USART配置如下:UART配置如下&#xff1a;如果USART使用的是同步通信&#xff0c;那么UART配置就有差異。首先通信雙方都是使用USART的同步通信&#xff0c;一個主機&#xff0c;一個…

Debezium:一款基于CDC的開源數據同步工具

Debezium 是由 Red Hat 開源的一種基于變更數據捕獲&#xff08;CDC&#xff09; 的分布式平臺&#xff0c;專為實時捕獲和傳播數據庫的變更事件而設計。Debezium 常見的使用場景包括&#xff1a; 實時數據集成&#xff1a;將數據庫變更同步到數據倉庫或數據湖&#xff0c;支撐…

從面向對象編程語言PHP轉到Go時的一些疑惑?

前言 1、php中面向對象編程時 與 Go中的區別&#xff1f; 2、php中最常使用laravel框架&#xff0c;不用過多關注依賴注入和反射&#xff0c;在go中又該如何使用呢&#xff1f;是 舍棄&#xff1f; 本文是一個系統化梳理&#xff0c;幫助從 語言哲學 → 依賴注入在 Go 的現狀 →…

Vue3中使用konva插件動態制作海報以及可在畫布上隨意移動位置

1、下載konva插件 官網地址 npm install vue-konva konva --save2、在主文件中引入&#xff0c;如main.js import VueKonva from vue-konva; app.use(VueKonva);3、組件內使用&#xff0c;我現在的布局是左側是畫布&#xff0c;右側是相關設置&#xff08;顏色、標題等&#…