当前位置: 首页 > ops >正文

【PhysUnits】4.1 类型级比特位实现解释(boolean.rs)

一、源码

该代码实现了一个类型级(type-level)的布尔系统,允许在编译时进行布尔运算。

//! 类型级比特位实现
//!
//! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础
//!
//! 已实现的**类型运算符**:
//!
//! - 来自 `core::ops` 的:`BitAnd`(与), `BitOr`(或), `BitXor`(异或) 和 `Not`(非)
//! - 比较操作:`PartialEq`, `Eq`
//! - 转换操作:`From<bool>`, `Into<bool>`
//!
//! 别名定义:
//! - `P1` = `True` (逻辑真/正一)
//! - `Z0` = `False` (逻辑假/零)
//!
//! 示例:
//! ```
//! use your_crate::{P1, Z0, Boolean};
//!
//! let t = P1::new();
//! let f = Z0::new();
//!
//! assert_eq!(t & t, P1);
//! assert_eq!(t | f, P1);
//! assert_eq!(t ^ t, Z0);
//! assert_eq!(!t, Z0);
//! ```use core::ops::{BitAnd, BitOr, BitXor, Not};
use crate::sealed::Sealed;/// 编译时比特位的标记特征
pub trait Boolean: Sealed + Copy + Default + 'static {const BOOL: bool;fn new() -> Self;fn to_bool() -> bool {Self::BOOL}fn as_bool(&self) -> bool {Self::BOOL}
}/// 类型级比特位0(逻辑假)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct False;/// 类型级比特位0的别名(零)
pub type Z0 = False;impl False {#[inline(always)]pub const fn new() -> Self {False}
}/// 类型级比特位1(逻辑真)
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug, Default)]
pub struct True;/// 类型级比特位1的别名(正一)
pub type P1 = True;impl True {#[inline(always)]pub const fn new() -> Self {True}
}impl Sealed for False {}
impl Sealed for True {}impl Boolean for False {const BOOL: bool = false;#[inline(always)] fn new() -> Self { Self }
}impl Boolean for True {const BOOL: bool = true;#[inline(always)] fn new() -> Self { Self }
}// 实现所有逻辑运算(保持原有实现)
// ... [原有所有BitAnd/BitOr/BitXor/Not的实现保持不变]// 测试用例需要更新以包含别名测试
#[cfg(test)]
mod tests {use super::*;#[test]fn test_aliases() {let p1 = P1::new();let z0 = Z0::new();assert_eq!(p1, True);assert_eq!(z0, False);assert!(P1::BOOL);assert!(!Z0::BOOL);}#[test]fn test_boolean_ops_with_aliases() {let p1 = P1::new();let z0 = Z0::new();assert_eq!(p1 & p1, P1);assert_eq!(p1 | z0, P1);assert_eq!(p1 ^ p1, Z0);assert_eq!(!p1, Z0);}#[test]fn test_boolean_ops() {let t = True::new();let f = False::new();assert_eq!(t & t, True);assert_eq!(t & f, False);assert_eq!(f & t, False);assert_eq!(f & f, False);assert_eq!(t | t, True);assert_eq!(t | f, True);assert_eq!(f | t, True);assert_eq!(f | f, False);assert_eq!(t ^ t, False);assert_eq!(t ^ f, True);assert_eq!(f ^ t, True);assert_eq!(f ^ f, False);assert_eq!(!t, False);assert_eq!(!f, True);}#[test]fn test_conversions() {let t: &dyn Boolean = true.into();assert!(t.as_bool());let f: &dyn Boolean = false.into();assert!(!f.as_bool());assert!(bool::from(True::new()));assert!(!bool::from(False::new()));}
}

二、主要组件

  1. Boolean trait
  • 定义了类型级布尔值的基本行为和操作

  • 包含编译时常量BOOL表示布尔值

  • 提供构造方法new()和转换方法to_bool()/as_bool()

  • 标记为Sealed防止外部实现

  1. 布尔类型
  • False: 表示逻辑假/0

  • True: 表示逻辑真/1

类型别名:

Z0 = False (零)

P1 = True (正一)

  1. 实现的操作
  • 逻辑运算:

    • Not(非): !

    • BitAnd(与): &

    • BitOr(或): |

    • BitXor(异或): ^

  • 比较: PartialEq, Eq

  • 转换: From, Into

三、关键实现细节

  1. 常量值:
  • False::BOOL = false

  • True::BOOL = true

  1. 逻辑运算实现:
  • 每种运算都为所有可能的组合提供了具体实现

  • 例如True & False返回False

  1. 转换操作:
  • 可以从运行时bool转换为类型级布尔值

  • 也可以从类型级布尔值转换回运行时bool

  1. 性能优化:
  • 使用#[inline(always)]确保零运行时开销

  • 所有操作都在编译时完成

四、使用示例

use your_crate::{P1, Z0};let t = P1::new();  // True
let f = Z0::new();  // Falseassert_eq!(t & t, P1);  // True AND True = True
assert_eq!(t | f, P1);  // True OR False = True
assert_eq!(t ^ t, Z0);  // True XOR True = False
assert_eq!(!t, Z0);     // NOT True = False

五、测试用例

  1. 代码包含了全面的测试:

  2. 测试类型别名是否正确

  3. 测试所有逻辑运算

  4. 测试与运行时布尔值的转换

这种类型级编程技术在需要编译时计算和验证的场景中非常有用,如类型状态机、维度检查等。

http://www.xdnf.cn/news/6646.html

相关文章:

  • 大数据革命:转变商业洞察力
  • 虹桥前湾印象城MEGA品牌大会灵感迸发,共绘湾系生活新章
  • 智能AI构建工地安全网:跌倒、抽搐、区域入侵多场景覆盖
  • 卓力达电铸镍网:精密制造与跨领域应用的创新典范
  • 预测模型开发与评估:基于机器学习的数据分析实践
  • 数据服务共享平台方案
  • 分布式锁: Redisson红锁(RedLock)原理与实现细节
  • 【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总
  • 双流芯谷产业园:元宇宙枢纽的区位密码
  • IHttpHandler和Tcp Listener的web服务器接收上传文件有什么区别
  • 泰迪杯特等奖案例深度解析:基于MSER-CNN的商品图片字符检测与识别系统设计
  • 会议分享|高超声速流动测量技术研讨会精彩探析
  • 深入探索:Core Web Vitals 进阶优化与新兴指标
  • Windows11安装rockerMq5.0+以及springboot集成rockerMq
  • 现代计算机图形学Games101入门笔记(十四)
  • YOLO12改进-Backbone-引入MobileNetV4替换backbone,平衡精度与效率的问题
  • 在服务器上安装AlphaFold2遇到的问题(1)
  • LLaMA-Factory:准备模型和数据集
  • 【软件测试学习day8】性能测试相关指标
  • WebGL2光照效果
  • DeepSeek解读道德经 第三十四章
  • 背包问题详解
  • 华为云Flexus+DeepSeek征文|SpringBoot开发实战:基于ModelArts Studio高效集成DeepSeek大模型服务
  • 【“星睿O6”评测】对比高通8Gen3分类、检测、分割、超分网络的AIBenchmark测试
  • 对置式光电传感器市场报告:预计2031年全球市场销售额将攀升至 5.68 亿美元
  • ChatGPT再升级!
  • JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换
  • 拟合(最小二乘拟合)
  • OpenCV下安装opencv_contrib 扩展模块进行人脸特征识别mingw32
  • IDEA怎么汉化idea中文改回英文版