use std::{
fmt::{
self,
Display,
Formatter,
},
ops::{
BitAnd,
BitAndAssign,
BitOr,
BitOrAssign,
BitXor,
BitXorAssign,
Not,
},
};
use crate::{
Bit,
IterableByte,
Nybble,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Byte {
bit_0: Bit,
bit_1: Bit,
bit_2: Bit,
bit_3: Bit,
bit_4: Bit,
bit_5: Bit,
bit_6: Bit,
bit_7: Bit,
}
impl Byte {
#[must_use]
#[allow(clippy::too_many_arguments)]
pub const fn new(
zeroth: Bit,
first: Bit,
second: Bit,
third: Bit,
fourth: Bit,
fifth: Bit,
sixth: Bit,
seventh: Bit,
) -> Self {
Self {
bit_0: seventh, bit_1: sixth,
bit_2: fifth,
bit_3: fourth, bit_4: third, bit_5: second,
bit_6: first,
bit_7: zeroth, }
}
#[must_use]
pub fn from_nybbles(high_nybble: Nybble, low_nybble: Nybble) -> Self {
let mut byte = Self::default();
for i in 0..4 {
if high_nybble.get_bit(i) == Bit::One {
byte.set_bit((i + 4) as usize);
}
if low_nybble.get_bit(i) == Bit::One {
byte.set_bit(i as usize);
}
}
byte
}
#[must_use]
pub fn get_high_nybble(&self) -> Nybble {
let mut nybble = Nybble::default();
for i in 0..4 {
if self.get_bit(i + 4) == Bit::One {
nybble.set_bit(i);
}
}
nybble
}
#[must_use]
pub fn get_low_nybble(&self) -> Nybble {
let mut nybble = Nybble::default();
for i in 0..4 {
if self.get_bit(i) == Bit::One {
nybble.set_bit(i);
}
}
nybble
}
pub fn set_bit(&mut self, index: usize) {
match index {
0 => self.bit_0.set(),
2 => self.bit_2.set(),
1 => self.bit_1.set(),
3 => self.bit_3.set(),
4 => self.bit_4.set(),
5 => self.bit_5.set(),
6 => self.bit_6.set(),
7 => self.bit_7.set(),
_ => unreachable!("Index out of bounds"),
}
}
pub fn unset_bit(&mut self, index: usize) {
match index {
0 => self.bit_0.unset(),
1 => self.bit_1.unset(),
2 => self.bit_2.unset(),
3 => self.bit_3.unset(),
4 => self.bit_4.unset(),
5 => self.bit_5.unset(),
6 => self.bit_6.unset(),
7 => self.bit_7.unset(),
_ => unreachable!("Index out of bounds"),
}
}
#[must_use]
pub fn get_bit(&self, index: u8) -> Bit {
match index {
0 => self.bit_0,
1 => self.bit_1,
2 => self.bit_2,
3 => self.bit_3,
4 => self.bit_4,
5 => self.bit_5,
6 => self.bit_6,
7 => self.bit_7,
_ => panic!("Index out of bounds"),
}
}
pub fn flip_bit(&mut self, index: u8) {
match index {
0..=7 => {
match index {
0 => &mut self.bit_0,
1 => &mut self.bit_1,
2 => &mut self.bit_2,
3 => &mut self.bit_3,
4 => &mut self.bit_4,
5 => &mut self.bit_5,
6 => &mut self.bit_6,
7 => &mut self.bit_7,
_ => unreachable!(),
}
.flip();
}
_ => panic!("Index out of bounds"),
}
}
pub fn flip(&mut self) {
self.bit_0.flip();
self.bit_1.flip();
self.bit_2.flip();
self.bit_3.flip();
self.bit_4.flip();
self.bit_5.flip();
self.bit_6.flip();
self.bit_7.flip();
}
pub fn increment(&mut self) {
let mut carry = true;
let mut changes = Vec::new();
for (i, bit) in self.iter().enumerate() {
if !carry {
break;
}
if bit == Bit::One {
changes.push((i, false)); } else {
changes.push((i, true)); carry = false;
}
}
for (i, value) in changes {
if value {
self.set_bit(i);
} else {
self.unset_bit(i);
}
}
}
pub fn decrement(&mut self) {
let mut borrow = true;
let mut changes = Vec::new();
for (i, bit) in self.iter().enumerate() {
if !borrow {
break;
}
if bit == Bit::Zero {
changes.push((i, true)); } else {
changes.push((i, false)); borrow = false;
}
}
for (i, value) in changes {
if value {
self.set_bit(i);
} else {
self.unset_bit(i);
}
}
}
#[must_use]
pub const fn iter(&self) -> IterableByte {
IterableByte::new(self)
}
}
impl Display for Byte {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let number = u8::from(self);
write!(f, "{number:#04X}")
}
}
impl Default for Byte {
fn default() -> Self {
Self::new(
Bit::zero(), Bit::zero(),
Bit::zero(),
Bit::zero(),
Bit::zero(),
Bit::zero(),
Bit::zero(),
Bit::zero(), )
}
}
impl From<u8> for Byte {
fn from(n: u8) -> Self {
let mut byte = Self::default();
for i in 0..8 {
if n & (1 << i) != 0 {
byte.set_bit(i);
}
}
byte
}
}
impl From<&Byte> for u8 {
fn from(byte: &Byte) -> Self {
let mut n = 0;
for i in 0..8 {
if byte.get_bit(i) == Bit::One {
n |= 1 << i;
}
}
n
}
}
impl Not for Byte {
type Output = Self;
fn not(self) -> Self::Output {
let mut byte = self;
byte.flip();
byte
}
}
impl BitAnd for Byte {
type Output = Self;
fn bitand(self, rhs: Self) -> Self::Output {
let mut byte = self;
byte.bit_0 &= rhs.bit_0;
byte.bit_1 &= rhs.bit_1;
byte.bit_2 &= rhs.bit_2;
byte.bit_3 &= rhs.bit_3;
byte.bit_4 &= rhs.bit_4;
byte.bit_5 &= rhs.bit_5;
byte.bit_6 &= rhs.bit_6;
byte.bit_7 &= rhs.bit_7;
byte
}
}
impl BitAndAssign for Byte {
fn bitand_assign(&mut self, rhs: Self) {
self.bit_0 &= rhs.bit_0;
self.bit_1 &= rhs.bit_1;
self.bit_2 &= rhs.bit_2;
self.bit_3 &= rhs.bit_3;
self.bit_4 &= rhs.bit_4;
self.bit_5 &= rhs.bit_5;
self.bit_6 &= rhs.bit_6;
self.bit_7 &= rhs.bit_7;
}
}
impl BitOr for Byte {
type Output = Self;
fn bitor(self, rhs: Self) -> Self::Output {
let mut byte = self;
byte.bit_0 |= rhs.bit_0;
byte.bit_1 |= rhs.bit_1;
byte.bit_2 |= rhs.bit_2;
byte.bit_3 |= rhs.bit_3;
byte.bit_4 |= rhs.bit_4;
byte.bit_5 |= rhs.bit_5;
byte.bit_6 |= rhs.bit_6;
byte.bit_7 |= rhs.bit_7;
byte
}
}
impl BitOrAssign for Byte {
fn bitor_assign(&mut self, rhs: Self) {
self.bit_0 |= rhs.bit_0;
self.bit_1 |= rhs.bit_1;
self.bit_2 |= rhs.bit_2;
self.bit_3 |= rhs.bit_3;
self.bit_4 |= rhs.bit_4;
self.bit_5 |= rhs.bit_5;
self.bit_6 |= rhs.bit_6;
self.bit_7 |= rhs.bit_7;
}
}
impl BitXor for Byte {
type Output = Self;
fn bitxor(self, rhs: Self) -> Self::Output {
let mut byte = self;
byte.bit_0 ^= rhs.bit_0;
byte.bit_1 ^= rhs.bit_1;
byte.bit_2 ^= rhs.bit_2;
byte.bit_3 ^= rhs.bit_3;
byte.bit_4 ^= rhs.bit_4;
byte.bit_5 ^= rhs.bit_5;
byte.bit_6 ^= rhs.bit_6;
byte.bit_7 ^= rhs.bit_7;
byte
}
}
impl BitXorAssign for Byte {
fn bitxor_assign(&mut self, rhs: Self) {
self.bit_0 ^= rhs.bit_0;
self.bit_1 ^= rhs.bit_1;
self.bit_2 ^= rhs.bit_2;
self.bit_3 ^= rhs.bit_3;
self.bit_4 ^= rhs.bit_4;
self.bit_5 ^= rhs.bit_5;
self.bit_6 ^= rhs.bit_6;
self.bit_7 ^= rhs.bit_7;
}
}
impl<'a> IntoIterator for &'a Byte {
type IntoIter = IterableByte<'a>;
type Item = Bit;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_display() {
let byte = Byte::from(0b10101010);
assert_eq!(format!("{}", byte), "0xAA");
}
#[test]
fn test_default() {
let byte = Byte::default();
assert_eq!(u8::from(&byte), 0b00000000);
}
#[test]
fn test_from_u8_zero() {
let byte = Byte::from(0);
assert_eq!(byte, Byte::default());
}
#[test]
fn test_from_u8_one() {
let byte = Byte::from(1);
let mut expected = Byte::default();
expected.set_bit(0);
assert_eq!(byte, expected);
}
#[test]
fn test_from_u8_max() {
let byte = Byte::from(u8::MAX);
let mut expected = Byte::default();
for i in 0..8 {
expected.set_bit(i);
}
assert_eq!(byte, expected);
}
#[test]
fn test_from_nybbles_ones() {
let high_nybble = Nybble::from(15);
let low_nybble = Nybble::from(15);
let byte = Byte::from_nybbles(high_nybble, low_nybble);
assert_eq!(u8::from(&byte), 0b11111111);
}
#[test]
fn test_from_nybbles_zeros() {
let high_nybble = Nybble::default();
let low_nybble = Nybble::default();
let byte = Byte::from_nybbles(high_nybble, low_nybble);
assert_eq!(u8::from(&byte), 0);
}
#[test]
fn test_from_nybbles_alternating() {
let high_nybble = Nybble::from(0b1010);
let low_nybble = Nybble::from(0b0101);
let byte = Byte::from_nybbles(high_nybble, low_nybble);
assert_eq!(u8::from(&byte), 0b10100101);
let high_nybble = Nybble::from(0b0101);
let low_nybble = Nybble::from(0b1010);
let byte = Byte::from_nybbles(high_nybble, low_nybble);
assert_eq!(u8::from(&byte), 0b01011010);
}
#[test]
fn test_to_u8_all_zeros() {
let byte = Byte::default();
assert_eq!(u8::from(&byte), 0b00000000);
}
#[test]
fn test_to_u8_all_ones() {
let byte = Byte::from(0b11111111);
assert_eq!(u8::from(&byte), 0b11111111);
}
#[test]
fn test_to_u8_alternating_raw() {
let byte = Byte::new(
Bit::one(),
Bit::zero(),
Bit::one(),
Bit::zero(),
Bit::one(),
Bit::zero(),
Bit::one(),
Bit::zero(),
);
assert_eq!(u8::from(&byte), 0b10101010);
}
#[test]
fn test_to_u8_alternating() {
let byte = Byte::from(0b10101010);
assert_eq!(u8::from(&byte), 0b10101010);
}
#[test]
fn test_to_u8_random() {
let byte = Byte::from(0b11001100);
assert_eq!(u8::from(&byte), 0b11001100);
}
#[test]
fn test_get_high_nybble_all_zeros() {
let byte = Byte::default();
let nybble = byte.get_high_nybble();
assert_eq!(u8::from(&nybble), 0b0000);
}
#[test]
fn test_get_high_nybble_all_ones() {
let byte = Byte::from(0b11111111);
let nybble = byte.get_high_nybble();
assert_eq!(u8::from(&nybble), 15);
}
#[test]
fn test_get_high_nybble_alternating() {
let byte = Byte::from(0b10101010);
let nybble = byte.get_high_nybble();
assert_eq!(u8::from(&nybble), 0b1010);
}
#[test]
fn test_get_high_nybble_random() {
let byte = Byte::from(0b11001100);
let nybble = byte.get_high_nybble();
assert_eq!(u8::from(&nybble), 0b1100);
}
#[test]
fn test_get_low_nybble_all_zeros() {
let byte = Byte::default();
let nybble = byte.get_low_nybble();
assert_eq!(u8::from(&nybble), 0b0000);
}
#[test]
fn test_get_low_nybble_all_ones() {
let byte = Byte::from(0b11111111);
let nybble = byte.get_low_nybble();
assert_eq!(u8::from(&nybble), 15);
}
#[test]
fn test_get_low_nybble_alternating() {
let byte = Byte::from(0b10101010);
let nybble = byte.get_low_nybble();
assert_eq!(u8::from(&nybble), 0b1010);
}
#[test]
fn test_get_low_nybble_random() {
let byte = Byte::from(0b11001100);
let nybble = byte.get_low_nybble();
assert_eq!(u8::from(&nybble), 0b1100);
}
#[test]
fn test_set_bit_valid() {
let mut byte = Byte::default();
byte.set_bit(0);
assert_eq!(u8::from(&byte), 1);
let mut byte = Byte::default();
byte.set_bit(1);
assert_eq!(u8::from(&byte), 2);
let mut byte = Byte::default();
byte.set_bit(2);
assert_eq!(u8::from(&byte), 4);
let mut byte = Byte::default();
byte.set_bit(3);
assert_eq!(u8::from(&byte), 0b00001000);
let mut byte = Byte::default();
byte.set_bit(4);
assert_eq!(u8::from(&byte), 0b00010000);
let mut byte = Byte::default();
byte.set_bit(5);
assert_eq!(u8::from(&byte), 0b00100000);
let mut byte = Byte::default();
byte.set_bit(6);
assert_eq!(u8::from(&byte), 0b01000000);
let mut byte = Byte::default();
byte.set_bit(7);
assert_eq!(u8::from(&byte), 0b10000000);
}
#[test]
#[should_panic(expected = "Index out of bounds")]
fn test_set_bit_out_of_bounds() {
let mut byte = Byte::default();
byte.set_bit(8);
}
#[test]
fn test_unset_bit_valid() {
let mut byte = Byte::from(0b11111111);
byte.unset_bit(0);
assert_eq!(u8::from(&byte), 0b11111110);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(1);
assert_eq!(u8::from(&byte), 0b11111101);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(2);
assert_eq!(u8::from(&byte), 0b11111011);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(3);
assert_eq!(u8::from(&byte), 0b11110111);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(4);
assert_eq!(u8::from(&byte), 0b11101111);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(5);
assert_eq!(u8::from(&byte), 0b11011111);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(6);
assert_eq!(u8::from(&byte), 0b10111111);
let mut byte = Byte::from(0b11111111);
byte.unset_bit(7);
assert_eq!(u8::from(&byte), 0b01111111);
}
#[test]
#[should_panic(expected = "Index out of bounds")]
fn test_unset_bit_out_of_bounds() {
let mut byte = Byte::from(0b00000000);
byte.unset_bit(8);
}
#[test]
fn test_get_bit_valid() {
let byte = Byte::from(0b01010101);
assert_eq!(byte.get_bit(0), Bit::One);
assert_eq!(byte.get_bit(1), Bit::Zero);
assert_eq!(byte.get_bit(2), Bit::One);
assert_eq!(byte.get_bit(3), Bit::Zero);
assert_eq!(byte.get_bit(4), Bit::One);
assert_eq!(byte.get_bit(5), Bit::Zero);
assert_eq!(byte.get_bit(6), Bit::One);
assert_eq!(byte.get_bit(7), Bit::Zero);
}
#[test]
#[should_panic(expected = "Index out of bounds")]
fn test_get_bit_out_of_bounds() {
let byte = Byte::from(0b00000000);
let _ = byte.get_bit(8);
}
#[test]
fn test_flip_bit_valid() {
let mut byte = Byte::from(0b01010101);
byte.flip_bit(0);
assert_eq!(u8::from(&byte), 0b01010100);
byte.flip_bit(1);
assert_eq!(u8::from(&byte), 0b01010110);
byte.flip_bit(2);
assert_eq!(u8::from(&byte), 0b01010010);
byte.flip_bit(3);
assert_eq!(u8::from(&byte), 0b01011010);
byte.flip_bit(4);
assert_eq!(u8::from(&byte), 0b01001010);
byte.flip_bit(5);
assert_eq!(u8::from(&byte), 0b01101010);
byte.flip_bit(6);
assert_eq!(u8::from(&byte), 0b00101010);
byte.flip_bit(7);
assert_eq!(u8::from(&byte), 0b10101010);
}
#[test]
#[should_panic(expected = "Index out of bounds")]
fn test_flip_bit_out_of_bounds() {
let mut byte = Byte::from(0b00000000);
byte.flip_bit(8);
}
#[test]
fn test_flip_all_bits() {
let mut byte = Byte::from(0b11111111);
byte.flip();
assert_eq!(u8::from(&byte), 0b00000000);
}
#[test]
fn test_flip_no_bits() {
let mut byte = Byte::from(0b00000000);
byte.flip();
assert_eq!(u8::from(&byte), 0b11111111);
}
#[test]
fn test_flip_odd_bits() {
let mut byte = Byte::from(0b01010101);
byte.flip();
assert_eq!(u8::from(&byte), 0b10101010);
}
#[test]
fn test_flip_even_bits() {
let mut byte = Byte::from(0b10101010);
byte.flip();
assert_eq!(u8::from(&byte), 0b01010101);
}
#[test]
fn test_flip_alternating_bits() {
let mut byte = Byte::from(0b01010101);
byte.flip();
assert_eq!(u8::from(&byte), 0b10101010);
byte.flip();
assert_eq!(u8::from(&byte), 0b01010101);
}
#[test]
fn test_bitnot() {
let byte = Byte::from(0b10101010);
let result = !byte;
assert_eq!(u8::from(&result), 0b01010101);
let byte = Byte::from(0b11110000);
let result = !byte;
assert_eq!(u8::from(&result), 0b00001111);
let byte = Byte::from(0b00000000);
let result = !byte;
assert_eq!(u8::from(&result), 0b11111111);
}
#[test]
fn test_bitand() {
let byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
let result = byte1 & byte2;
assert_eq!(u8::from(&result), 0b10001000);
let byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
let result = byte1 & byte2;
assert_eq!(u8::from(&result), 0b00000000);
let byte1 = Byte::from(0b11111111);
let byte2 = Byte::from(0b11111111);
let result = byte1 & byte2;
assert_eq!(u8::from(&result), 0b11111111);
}
#[test]
fn test_bitand_assign() {
let mut byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
byte1 &= byte2;
assert_eq!(u8::from(&byte1), 0b10001000);
let mut byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
byte1 &= byte2;
assert_eq!(u8::from(&byte1), 0b00000000);
let mut byte1 = Byte::from(0b11111111);
let byte2 = Byte::from(0b11111111);
byte1 &= byte2;
assert_eq!(u8::from(&byte1), 0b11111111);
}
#[test]
fn test_bitor() {
let byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
let result = byte1 | byte2;
assert_eq!(u8::from(&result), 0b11101110);
let byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
let result = byte1 | byte2;
assert_eq!(u8::from(&result), 0b11111111);
let byte1 = Byte::from(0b00000000);
let byte2 = Byte::from(0b11111111);
let result = byte1 | byte2;
assert_eq!(u8::from(&result), 0b11111111);
}
#[test]
fn test_bitor_assign() {
let mut byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
byte1 |= byte2;
assert_eq!(u8::from(&byte1), 0b11101110);
let mut byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
byte1 |= byte2;
assert_eq!(u8::from(&byte1), 0b11111111);
let mut byte1 = Byte::from(0b00000000);
let byte2 = Byte::from(0b11111111);
byte1 |= byte2;
assert_eq!(u8::from(&byte1), 0b11111111);
}
#[test]
fn test_bitxor() {
let byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
let result = byte1 ^ byte2;
assert_eq!(u8::from(&result), 0b01100110);
let byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
let result = byte1 ^ byte2;
assert_eq!(u8::from(&result), 0b11111111);
let byte1 = Byte::from(0b00000000);
let byte2 = Byte::from(0b11111111);
let result = byte1 ^ byte2;
assert_eq!(u8::from(&result), 0b11111111);
}
#[test]
fn test_bitxor_assign() {
let mut byte1 = Byte::from(0b10101010);
let byte2 = Byte::from(0b11001100);
byte1 ^= byte2;
assert_eq!(u8::from(&byte1), 0b01100110);
let mut byte1 = Byte::from(0b11110000);
let byte2 = Byte::from(0b00001111);
byte1 ^= byte2;
assert_eq!(u8::from(&byte1), 0b11111111);
let mut byte1 = Byte::from(0b00000000);
let byte2 = Byte::from(0b11111111);
byte1 ^= byte2;
assert_eq!(u8::from(&byte1), 0b11111111);
}
#[test]
fn test_increment() {
let mut byte = Byte::default();
byte.increment();
assert_eq!(u8::from(&byte), 1);
let mut byte = Byte::from(0b11111111);
byte.increment();
assert_eq!(u8::from(&byte), 0);
let mut byte = Byte::from(0b00001111);
byte.increment();
assert_eq!(u8::from(&byte), 0b00010000);
let mut byte = Byte::from(0b11110000);
byte.increment();
assert_eq!(u8::from(&byte), 0b11110001);
}
#[test]
fn test_decrement() {
let mut byte = Byte::default();
byte.decrement();
assert_eq!(u8::from(&byte), 0b11111111);
let mut byte = Byte::from(0b11111111);
byte.decrement();
assert_eq!(u8::from(&byte), 0b11111110);
let mut byte = Byte::from(0b00001111);
byte.decrement();
assert_eq!(u8::from(&byte), 0b00001110);
let mut byte = Byte::from(0b11110000);
byte.decrement();
assert_eq!(u8::from(&byte), 0b11101111);
}
#[test]
fn test_iter() {
let byte = Byte::from(0b10101010);
let mut iter = byte.iter();
assert_eq!(iter.next(), Some(Bit::Zero)); assert_eq!(iter.next(), Some(Bit::One)); assert_eq!(iter.next(), Some(Bit::Zero)); assert_eq!(iter.next(), Some(Bit::One)); assert_eq!(iter.next(), Some(Bit::Zero)); assert_eq!(iter.next(), Some(Bit::One)); assert_eq!(iter.next(), Some(Bit::Zero)); assert_eq!(iter.next(), Some(Bit::One));
assert_eq!(iter.next(), None);
}
#[test]
fn test_into_iter() {
let byte = Byte::from(0b10101010); let mut iter = (&byte).into_iter();
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::One));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::One));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::One));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::One));
assert_eq!(iter.next(), None); }
#[test]
fn test_into_iter_empty_byte() {
let byte = Byte::from(0b00000000); let mut iter = (&byte).into_iter();
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), Some(Bit::Zero));
assert_eq!(iter.next(), None); }
}