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

【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.xdnf.cn/news/17009.html

相关文章:

  • 规则方法关系抽取-笔记总结
  • 县级融媒体中心备份与恢复策略(精简版3-2-1架构)
  • 文件包含篇
  • 秋招笔记-8.4
  • Java基础学习(一):类名规范、返回值、注释、数据类型
  • C++面试题及详细答案100道( 01-10 )
  • 【数据结构】排序(sort) -- 插入排序
  • 【深度学习新浪潮】近三年城市级数字孪生的研究进展一览
  • 【数据结构入门】链表
  • Vue3核心语法进阶(生命周期)
  • 【教学类-52-17】20250803动物数独_空格尽量分散_只有一半关卡数(N宫格通用版3-10宫格)0图、1图、2图、6图、有答案、无答案 组合版24套
  • 华为OD机考2025C卷 - 分配土地 (Java Python JS C++ C )
  • 【Spring AI快速上手 (二)】Advisor实现对话上下文管理
  • 体验Java接入langchain4j运用大模型OpenAi
  • 30天入门Python(基础篇)——第31天:标准库学习之re模块
  • 如何给Word和WPS文档添加密码或取消密码
  • 【回眸】香橙派zero2 阿里云机器视觉分拣系统
  • odoo reportbro 拖拽式报表设计
  • 广东省省考备考(第六十六天8.4)——言语、常识(强化训练)
  • 【笔记】重学单片机(51)(下)
  • Git基础玩法简单描述
  • 【Django】-3- 处理HTTP响应
  • 二值图针对内部轮廓腐蚀膨胀
  • 网安学习NO.21
  • GaussDB 数据库架构师(十二) 资源规划
  • 基于鼠标位置的相机缩放和平移命令的实现(原理+源码)
  • 下面是修正后的完整版 doit_effects.c,已经做了三大关键修复(文件开头也有注释说明)
  • [激光原理与应用-135]:光学器件 - 透镜的本质是利用材料对光的折射特性,通过特定形状的表面设计,实现对光线的会聚、发散或成像控制的光学元件
  • 决策树(回归树)全解析:原理、实践与应用
  • 区块链基础之Merkle B+树