【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));}
}
二、源码分析
- 基本类型
use crate::number::{O, I, Bit};
-
O 和 I 是表示二进制位0和1的类型
-
Bit 是一个trait,表示这些类型是二进制位
- 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() 返回一个元组 (进位, 和)
- 实现所有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中使用类型系统来进行计算,而不是传统的运行时计算。