1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::Bit;
use std::ops::BitAnd;

impl BitAnd for Bit {
    type Output = Self;
    fn bitand(self, b: Self) -> Self::Output {
        and(&self, &b)
    }
}

impl BitAnd<&Bit> for Bit {
    type Output = Self;
    fn bitand(self, b: &Bit) -> Self::Output {
        and(&self, b)
    }
}

impl BitAnd for &Bit {
    type Output = Bit;
    fn bitand(self, b: Self) -> Bit {
        and(self, b)
    }
}

impl BitAnd<Bit> for &Bit {
    type Output = Bit;
    fn bitand(self, b: Bit) -> Bit {
        and(self, &b)
    }
}

fn and(a: &Bit, b: &Bit) -> Bit {

    if a == &Bit::One && b == &Bit::One {
        Bit::One
    } else {
        Bit::Zero
    }
    
}