当前位置: 首页 > 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.dtcms.com/a/313820.html

相关文章:

  • 哪些第三方 Crate 可以直接用?
  • Mac桌面仿制项目--让ai一句话生成的
  • Qt 使用QtXlsx库处理Excel文件
  • Druid学习笔记 01、快速了解Druid中SqlParser实现
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:General Purpose I/O (GPIO)通用输入 / 输出
  • Linux文件权限管理全解
  • Java Getter 与 C# Getter 比较
  • WPF中引用其他元素各种方法
  • AUTOSAR AR-Explorer正式发布
  • C语言的数组与字符串
  • 从物理扇区到路径访问:Linux文件抽象的全景解析
  • 读写分离有那些坑?
  • 【企业架构】TOGAF概念之三
  • 【Linux | 网络】网络层(IP协议、NAT技术和ICMP协议)
  • 大模型 与 自驾 具身 3D世界模型等相关知识
  • GaussDB 数据库架构师(十二) 资源规划
  • 音视频文案字幕一键提取,免费使用,效率软件!
  • 开源的现代数据探索和可视化平台:Apache Superset 快速指南 Quickstart
  • 大模型探秘–AI 感知世界:从对话到掌控的交互革命
  • 13015计算机系统原理-速记宝典
  • 【Linux操作系统】简学深悟启示录:进程初步
  • Apache IoTDB(3):时序数据库 IoTDB Docker部署实战
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现人脸面部表情的追踪识别(C#代码UI界面版)
  • 商标续展如果逾期了还有办法补救吗?
  • 第1章-信息系统与信息技术发展
  • 案件线索展示与交付项目
  • C++11 nullptr:解决空指针语义模糊的终极方案
  • 疯狂星期四文案网第29天运营日记
  • 2.1 vue组件
  • 音视频学习笔记