【unitrix】 4.7 庫數字取反(not.rs)

一、源碼

這段代碼是用Rust語言實現的一個庫,主要功能是對數字進行位取反操作(按位NOT運算)。

/*庫數字取反* 編制人: $ource* 修改版次:0版完成版* 本版次創建時間: 2025年6月25日* 最后修改時間: 無* 待完善問題:無*/
use core::ops::Not;
use crate::number::{Z0, P1, N1, B0, B1, NonNegOne, NonZero, Var, PrimitiveInt};// ==================== 位取反運算實現 ====================// 基礎類型實現
impl Not for Z0 {  // !0 = -1type Output = N1;fn not(self) -> Self::Output { N1 }
}impl Not for P1 {  // !1 = -2 (二進制表示為 B0<N1>)type Output = B0<N1>;fn not(self) -> Self::Output { B0::new() }
}impl Not for N1 {  // !(-1) = 0type Output = Z0;fn not(self) -> Self::Output { Z0 }
}// 遞歸類型實現
impl<Other: NonZero + NonNegOne + Not> Not for B0<Other> {  // !B0<T> = B1<!T>type Output = B1<Other::Output>;fn not(self) -> Self::Output { B1::new() }
}impl<Other: NonZero + Not> Not for B1<Other> {  // !B1<T> = B0<!T>type Output = B0<Other::Output>;fn not(self) -> Self::Output { B0::new() }
}// 特殊處理
impl Not for B0<N1> {  // !(-2) = 1 特例type Output = P1;fn not(self) -> Self::Output { P1 }
}/* 注意:
1. 小數類型未實現取反,因為小數部分取反會產生無限尾部1
2. 浮點類型不支持位取反操作(無實際意義)
*/// 變量類型取反
impl<T: PrimitiveInt + Not> Not for Var<T> {  // !Var<T> = Var<!T>type Output = Var<<T as Not>::Output>;#[inline(always)]fn not(self) -> Self::Output { Var(!self.0) }
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_basic_not() {assert_eq!(!Z0, N1);assert_eq!(!P1, B0::<N1>::new());assert_eq!(!N1, Z0);}#[test]fn test_recursive_not() {let b0n1 = B0::<N1>::new();assert_eq!(!b0n1, P1); // 特殊處理let b1z0 = B1::<P1>::new();assert_eq!(!b1z0, B0::<B0<N1>>::new());}#[test]fn test_var_not() {let var = Var(42i32);let res = !var;assert_eq!(res.0, !42i32);}
}

二、代碼分析

  1. 導入依賴

use core::ops::Not;
use crate::number::{Z0, P1, N1, B0, B1, NonNegOne, NonZero, Var, PrimitiveInt};

導入了Rust核心庫中的Not trait(用于實現取反操作)和自定義的數字類型。
2. 基礎類型實現


impl Not for Z0 {  // !0 = -1type Output = N1;fn not(self) -> Self::Output { N1 }
}impl Not for P1 {  // !1 = -2 (二進制表示為 B0<N1>)type Output = B0<N1>;fn not(self) -> Self::Output { B0::new() }
}impl Not for N1 {  // !(-1) = 0type Output = Z0;fn not(self) -> Self::Output { Z0 }
}

這部分為基本數字類型實現了Not trait:

  • Z0(零):取反結果為N1(負一)

  • P1(正一):取反結果為B0(負二)

  • N1(負一):取反結果為Z0(零)

  1. 遞歸類型實現

impl<Other: NonZero + NonNegOne + Not> Not for B0<Other> {  // !B0<T> = B1<!T>type Output = B1<Other::Output>;fn not(self) -> Self::Output { B1::new() }
}impl<Other: NonZero + Not> Not for B1<Other> {  // !B1<T> = B0<!T>type Output = B0<Other::Output>;fn not(self) -> Self::Output { B0::new() }
}

這部分為遞歸數字類型實現了Not trait:

  • B0(二進制0前綴的數):取反結果為B1<!T>

  • B1(二進制1前綴的數):取反結果為B0<!T>

  1. 特殊處理

impl Not for B0<N1> {  // !(-2) = 1 特例type Output = P1;fn not(self) -> Self::Output { P1 }
}

對B0(即-2)做了特殊處理,直接返回P1(1),因為這是遞歸實現的邊界情況。
5. 變量類型實現


impl<T: PrimitiveInt + Not> Not for Var<T> {  // !Var<T> = Var<!T>type Output = Var<<T as Not>::Output>;#[inline(always)]fn not(self) -> Self::Output { Var(!self.0) }
}

為Var類型實現了Not trait,它包裝了一個原始整數類型,直接調用該類型的取反操作。
6. 測試模塊


#[cfg(test)]
mod tests {use super::*;#[test]fn test_basic_not() {assert_eq!(!Z0, N1);assert_eq!(!P1, B0::<N1>::new());assert_eq!(!N1, Z0);}#[test]fn test_recursive_not() {let b0n1 = B0::<N1>::new();assert_eq!(!b0n1, P1); // 特殊處理let b1z0 = B1::<P1>::new();assert_eq!(!b1z0, B0::<B0<N1>>::new());}#[test]fn test_var_not() {let var = Var(42i32);let res = !var;assert_eq!(res.0, !42i32);}
}

測試模塊包含三個測試:

  • 測試基本類型的取反操作

  • 測試遞歸類型的取反操作

  • 測試變量類型的取反操作

三、總結

這段代碼實現了一個類型安全的數字取反操作庫,特點包括:

  • 支持基本數字類型(零、正一、負一)的取反

  • 支持遞歸定義的二進制數的取反

  • 對特定邊界情況做了特殊處理

  • 提供了變量類型的取反支持

  • 通過泛型和trait實現了類型安全的操作

這個庫是類型級數學計算的一部分,使用了Rust的類型系統來保證數字操作的安全性。

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

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

相關文章

在ASP.NET Core WebApi中使用日志系統(Serilog)

一.引言 日志是構建健壯 Web API 的重要組成部分&#xff0c;能夠幫助我們追蹤請求、診斷問題、記錄關鍵事件。在 .Net 中&#xff0c;日志系統由內置的 Microsoft.Extensions.Logging 抽象提供統一接口&#xff0c;并支持多種第三方日志框架&#xff08;如 Serilog、NLog 等&…

(鏈表:哈希表 + 雙向鏈表)146.LRU 緩存

題目 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 LRU是Least Recently Used的縮寫&#xff0c;即最近最少使用&#xff0c;是一種常用的頁面置換算法&#xff0c;選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段&#xff0c;用來記…

Go Web開發框架實踐:模板渲染與靜態資源服務

Gin 不僅適合構建 API 服務&#xff0c;也支持 HTML 模板渲染和靜態資源托管&#xff0c;使其可以勝任中小型網站開發任務。 一、模板渲染基礎 1. 加載模板文件 使用 LoadHTMLGlob 或 LoadHTMLFiles 方法加載模板&#xff1a; r : gin.Default() r.LoadHTMLGlob("templ…

緩存與加速技術實踐-Kafka消息隊列

目錄 #1.1消息隊列 1.1.1什么是消息隊列 1.1.2消息隊列的特征 1.1.3為什么需要消息隊列 #2.1ksfka基礎與入門 2.1.1kafka基本概念 2.1.2kafka相關術語 2.1.3kafka拓撲架構 #3.1zookeeper概述介紹 3.1.1zookeeper應用舉例 3.1.2zookeeper的工作原理是什么&#xff1f; 3.1.3z…

鴻蒙前后端部署教程

第一步&#xff1a;部署Java后端 打開IDEA編輯器 第二步&#xff1a;用DevEco Studio運行鴻蒙端項目 然后按WinR鍵調出Win的命令行&#xff0c;輸入ipconfig 打開后端IDEA可以查看數據庫情況&#xff0c;如下圖

Python 常用定時任務框架介紹及代碼舉例

文章目錄 Python 常用定時任務框架簡介&#x1f9e9; 一、輕量級方案&#xff08;適合簡單任務&#xff09;1. **schedule庫** ?? 二、中級方案&#xff08;平衡功能與復雜度&#xff09;2. **APScheduler**3. **Celery Celery Beat** &#x1f680; 三、異步專用方案&#…

使用redis服務的redisson架構實現分布式鎖

加鎖 /*** 嘗試為指定的許可證 ID 獲取分布式鎖。如果鎖已被占用&#xff0c;則立即拋出業務異常。** param licenseId 需要加鎖的許可證 ID&#xff08;即鎖名稱&#xff09;* return true 表示成功獲取鎖&#xff0c;但請注意&#xff1a;* 鎖實際持有時間為 30 秒…

HTML表格元素

HTML表格元素深度解析與實戰應用 一、表格基本結構與語義化 1. 基礎表格元素詳解 <table> 容器元素 核心作用&#xff1a;定義表格容器重要屬性&#xff1a; border&#xff1a;已廢棄&#xff0c;應使用CSS設置邊框aria-label/aria-labelledby&#xff1a;為屏幕閱讀…

如何使用 Dockerfile 創建自定義鏡像

使用 Dockerfile 創建自定義鏡像的過程非常清晰&#xff0c;通常包括定義基礎鏡像、安裝依賴、復制代碼、設置環境變量和啟動命令等步驟。下面詳細講解從零創建自定義鏡像的完整流程。 一、什么是 Dockerfile&#xff1f; Dockerfile 是一個文本文件&#xff0c;定義了如何構建…

設置AWS EC2默認使用加密磁盤

問題 EC2磁盤需要使用默認加密。這里需要設置一下默認加密。 EC2

【樹的概念及其堆的實現】

樹的概念及其堆的實現 1.樹的概念2.樹的相關概念3.二叉樹的概念4. 滿二叉樹和完全二叉樹5.二叉樹的存儲結構6.二叉樹順序結構的實現的7.堆的結構及其實現 1.樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系…

鴻蒙系統(HarmonyOS)經典紅色風格登錄頁布局

預覽 簡介 基于鴻蒙系統&#xff08;HarmonyOS&#xff09;開發的現代化登錄界面&#xff0c;采用了科技感十足的紅色主題設計。該界面結合了流暢的動畫效果、精心設計的視覺元素和人性化的交互體驗&#xff0c;為用戶提供了一個安全、美觀且易用的登錄入口。 &#x1f3a8; …

C++虛函數多態

class C{ public:void x1(){};void x2(){};};C c; cout << sizeof(c) <<"\n";1字節 class D{ public:void x1(){};void x2(){};virtual void x3(){};//void *vptr看不見的虛函數表指針 }; D d; cout << sizeof(d) <<"\n";8字節類A…

新編輯器編寫指南--給自己的備忘

歡迎使用Markdown編輯器 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能拓展與語法支持&#x…

目標檢測neck算法之MPCA和FSA的源碼實現

目標檢測neck算法之MPCA和FSA的源碼實現 使用BIBM2024 Spatial-Frequency Dual Domain Attention Network For Medical Image Segmentation的Frequency-Spatial Attention和Multi-scale Progressive Channel Attention改進neck. 接下來&#xff0c;我將講解它的源碼操作的實現…

MyBatis-Plus的3.5.7和PageHelper的那個版本對應

MyBatis-Plus的3.5.7和PageHelper的那個版本對應 根據你的知識庫中提到的信息&#xff1a; MyBatis-Plus 3.5.7 使用的是 JSqlParser 4.6 版本。PageHelper 若使用了不同版本的 JSqlParser&#xff08;如 4.7&#xff09;&#xff0c;會導致沖突。 ? 推薦對應關系 為了保證…

Apifox 6 月產品更新|支持 AI 能力、交互優化、在線文檔新增 SEO 設置、gRPC 項目支持前/后置操作

在 2025 年的 API 開發領域&#xff0c;Apifox 作為一款集 API 設計、調試、Mock 和測試于一體的協作平臺&#xff0c;已成為開發者的“得力助手”。然而&#xff0c;隨著業務需求的不斷增長&#xff0c;開發者對工具的效率和功能提出了更高的要求。6 月份&#xff0c;Apifox 推…

Acrobat JavaScript 從瀏覽器到 PDF 環境的轉換

目錄 什么是 JavaScript?JavaScript 核心語言與 Acrobat 特定 API學習 JavaScript 核心語言的挑戰瀏覽器與 Acrobat JavaScript 的關鍵差異在 Acrobat 中運行 JavaScript 代碼替代瀏覽器特定函數的方法后續學習建議什么是 JavaScript? JavaScript 最初于 1995 年作為 Netsca…

OpenCV CUDA模塊設備層-----指數運算函數exp()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 設備端數學函數 中的一個內聯函數&#xff0c;用于在 GPU 上對 uchar1 類型&#xff08;單通道圖像像素&#xff09;執行指數運算…

C++面向對象5——C++關鍵字、構造函數與拷貝構造函數

this關鍵字 C關鍵字this的深度解析 1. this指針的本質 在C中&#xff0c;this是一個特殊的隱式指針&#xff0c;它存在于每個非靜態成員函數內部&#xff0c;指向調用該函數的當前對象。其類型為&#xff1a; 對于非const成員函數&#xff1a;ClassName* const&#xff08;…