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

【unitrix】 7.1 二进制位加法(bit_add.rs)

一、源码

这段代码是用Rust实现的一个位级全加器(Bit-level Full Adder),它使用类型系统来表示二进制位的加法操作。

use crate::number::{O, I, Bit};/// 位级全加器 trait
/// 输入: CarryIn + A + B
/// 输出: (CarryOut, Sum)
pub trait BitAdd<A: Bit, B: Bit> where Self: Bit {type CarryOut: Bit;type Sum: Bit;/// 计算进位fn carry_out(self, a: A, b: B) -> Self::CarryOut { Self::CarryOut::new() }/// 计算和fn sum(self, a: A, b: B) -> Self::Sum { Self::Sum::new() }/// 执行位加法fn bit_add(self, a: A, b: B) -> (Self::CarryOut, Self::Sum) where Self: Sized {(Self::CarryOut::new(), Self::Sum::new())}
}// 实现所有8种输入组合
impl BitAdd<O, O> for O { type CarryOut = O; type Sum = O; }  // 0+0+0=00
impl BitAdd<O, I> for O { type CarryOut = O; type Sum = I; }  // 0+0+1=01
impl BitAdd<I, O> for O { type CarryOut = O; type Sum = I; }  // 0+1+0=01
impl BitAdd<I, I> for O { type CarryOut = I; type Sum = O; }  // 0+1+1=10
impl BitAdd<O, O> for I { type CarryOut = O; type Sum = I; }  // 1+0+0=01
impl BitAdd<O, I> for I { type CarryOut = I; type Sum = O; }  // 1+0+1=10
impl BitAdd<I, O> for I { type CarryOut = I; type Sum = O; }  // 1+1+0=10
impl BitAdd<I, I> for I { type CarryOut = I; type Sum = I; }  // 1+1+1=11#[cfg(test)]
mod tests {use super::*;#[test]fn test_bit_add() {// 测试所有8种组合assert_eq!(O.bit_add(O, O), (O, O));assert_eq!(I.bit_add(O, O), (O, I));assert_eq!(O.bit_add(I, O), (O, I));assert_eq!(I.bit_add(I, O), (I, O));assert_eq!(O.bit_add(O, I), (O, I));assert_eq!(I.bit_add(O, I), (I, O));assert_eq!(O.bit_add(I, I), (I, O));assert_eq!(I.bit_add(I, I), (I, I));}
}

二、源码分析

  1. 基本类型

use crate::number::{O, I, Bit};
  • O 和 I 是表示二进制位0和1的类型

  • Bit 是一个trait,表示这些类型是二进制位

  1. BitAdd trait

pub trait BitAdd<A: Bit, B: Bit> where Self: Bit {type CarryOut: Bit;type Sum: Bit;fn carry_out(self, a: A, b: B) -> Self::CarryOut { Self::CarryOut::new() }fn sum(self, a: A, b: B) -> Self::Sum { Self::Sum::new() }fn bit_add(self, a: A, b: B) -> (Self::CarryOut, Self::Sum) where Self: Sized {(Self::CarryOut::new(), Self::Sum::new())}
}

这个trait定义了位加法的行为:

  • CarryOut 和 Sum 是关联类型,表示进位和和

  • carry_out() 计算进位

  • sum() 计算和

  • bit_add() 返回一个元组 (进位, 和)

  1. 实现所有8种输入组合

impl BitAdd<O, O> for O { type CarryOut = O; type Sum = O; }  // 0+0+0=00
impl BitAdd<O, I> for O { type CarryOut = O; type Sum = I; }  // 0+0+1=01
impl BitAdd<I, O> for O { type CarryOut = O; type Sum = I; }  // 0+1+0=01
impl BitAdd<I, I> for O { type CarryOut = I; type Sum = O; }  // 0+1+1=10
impl BitAdd<O, O> for I { type CarryOut = O; type Sum = I; }  // 1+0+0=01
impl BitAdd<O, I> for I { type CarryOut = I; type Sum = O; }  // 1+0+1=10
impl BitAdd<I, O> for I { type CarryOut = I; type Sum = O; }  // 1+1+0=10
impl BitAdd<I, I> for I { type CarryOut = I; type Sum = I; }  // 1+1+1=11

这些实现覆盖了全加器的所有可能输入组合(3个输入位,每个可以是0或1)。注释中显示了每种情况的计算结果(进位,和)。
4. 测试


#[cfg(test)]
mod tests {use super::*;#[test]fn test_bit_add() {// 测试所有8种组合assert_eq!(O.bit_add(O, O), (O, O));assert_eq!(I.bit_add(O, O), (O, I));assert_eq!(O.bit_add(I, O), (O, I));assert_eq!(I.bit_add(I, O), (I, O));assert_eq!(O.bit_add(O, I), (O, I));assert_eq!(I.bit_add(O, I), (I, O));assert_eq!(O.bit_add(I, I), (I, O));assert_eq!(I.bit_add(I, I), (I, I));}
}

测试验证了所有8种输入组合的输出是否正确。

三、工作原理

这是一个类型级(type-level)的实现,利用Rust的类型系统在编译期进行计算。每个实现对应一种输入组合,并指定了对应的输出类型。

例如:

  • O.bit_add(I, I) 表示 0 + 1 + 1,结果是 (I, O)(即进位1,和0)

  • I.bit_add(O, I) 表示 1 + 0 + 1,结果是 (I, O)(即进位1,和0)

这种实现方式展示了如何在Rust中使用类型系统来进行计算,而不是传统的运行时计算。

http://www.lryc.cn/news/610456.html

相关文章:

  • Minio部署和客户端使用 - 版本 2025-05-24T17-08-30Z
  • 县级融媒体中心备份与恢复策略(精简版3-2-1架构)
  • Javascript面试题及详细答案150道(046-060)
  • Linux 交换空间管理
  • 15个命令上手Linux!
  • 力扣top100--哈希
  • PandasAI连接LLM对MySQL数据库进行数据分析
  • 【笔记】重学单片机(51)(下)
  • ArcGIS的字段计算器生成随机数
  • 数据库提权
  • 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用
  • (论文速读)RMT:Retentive+ViT的视觉新骨干
  • Hadoop HDFS 3.3.4 讲解~
  • 嵌入式知识篇---闪存
  • mysql 数据库系统坏了,物理拷贝出数据怎么读取
  • Deepoc 赋能送餐机器人:从机械执行到具身智能的革命性跨越
  • JavaScript 中的流程控制语句详解
  • 机器学习实战:逻辑回归深度解析与欺诈检测评估指标详解(二)
  • Redis缓存详解及常见问题解决方案
  • MySQL 基本操作入门指南
  • MCP进阶:工业协议与AI智能体的融合革命
  • 使用 SecureCRT 连接华为 eNSP 模拟器的方法
  • typeof和instanceof区别
  • Linux学习记录(八)文件共享
  • 认识pytorch与pytorch lightning
  • BackgroundTasks 如何巧妙驾驭多任务并发?
  • 我的创作纪念日____在 CSDN一年来的成长历程和收获
  • openvela之内存管理
  • Linux 磁盘管理与分区配置
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-注册实现