home ~ projects ~ socials

Ouput Strings In Rust Based Off Which Bits Are Set In The Base2 Version Of A Number

There's almost certainly a way to do this by reading the bytes directly, but I haven't figured that out yet.

#[derive(Debug)]
struct Num {
  pub total: usize,
  pub parts: Vec<bool>,
}

impl Num {
  pub fn new(total: usize) -> Num {
    let b = format!("{:0>8b}", total);
    let parts = b.split("")
      .filter(|p| *p != "")
      .map(|p| p.parse().unwrap())
      .map(|p: usize| p == 1)
      .collect();
    Num { total, parts }
  }

  pub fn on_off(&self, index: usize) -> String {
    if self.parts[index] {
      "on".to_string()
    } else {
      "off".to_string()
    }
  }

  pub fn output_line(&self) -> String {
    format!(
      //r#"<div>{}</div><div>{}</div><div>{}</div><div>{}</div><div class="num">{}</div><div class="num">{:0>4b}</div><div class="num">{:b}</div>"#, 
      r#"<div class="num">{}</div><div class="num">{:0>8b}</div><div class="num">{:b}</div>"#, 
       //r#"<div class="num">{}</div><div class="num">{:0>8b}</div>"#, 
      //self.on_off(0),
      //self.on_off(1),
      //self.on_off(2),
      //self.on_off(3),
      self.total,
      self.total,
      self.total,
    )
  }
}

fn main() {
  for num in 0..16 {
    let n = Num::new(num);
    println!("{}", n.output_line());
  }
}
Output:
<div class="num">0</div><div class="num">00000000</div><div class="num">0</div>
<div class="num">1</div><div class="num">00000001</div><div class="num">1</div>
<div class="num">2</div><div class="num">00000010</div><div class="num">10</div>
<div class="num">3</div><div class="num">00000011</div><div class="num">11</div>
<div class="num">4</div><div class="num">00000100</div><div class="num">100</div>
<div class="num">5</div><div class="num">00000101</div><div class="num">101</div>
<div class="num">6</div><div class="num">00000110</div><div class="num">110</div>
<div class="num">7</div><div class="num">00000111</div><div class="num">111</div>
<div class="num">8</div><div class="num">00001000</div><div class="num">1000</div>
<div class="num">9</div><div class="num">00001001</div><div class="num">1001</div>
<div class="num">10</div><div class="num">00001010</div><div class="num">1010</div>
<div class="num">11</div><div class="num">00001011</div><div class="num">1011</div>
<div class="num">12</div><div class="num">00001100</div><div class="num">1100</div>
<div class="num">13</div><div class="num">00001101</div><div class="num">1101</div>
<div class="num">14</div><div class="num">00001110</div><div class="num">1110</div>
<div class="num">15</div><div class="num">00001111</div><div class="num">1111</div>

warning: field `parts` is never read
 --> _active_nvim_run:4:7
  |
2 | struct Num {
  |        --- field in this struct
3 |   pub total: usize,
4 |   pub parts: Vec<bool>,
  |       ^^^^^
  |
  = note: `Num` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
  = note: `#[warn(dead_code)]` on by default

warning: method `on_off` is never used
  --> _active_nvim_run:18:10
   |
7  | impl Num {
   | -------- method in this implementation
...
18 |   pub fn on_off(&self, index: usize) -> String {
   |          ^^^^^^
fn main() {
  for num in 0..16 {
    let b = format!("{:0>4b}", num);
    dbg!(b);
  }
}
Output:
[_active_nvim_run:4:5] b = "0000"
[_active_nvim_run:4:5] b = "0001"
[_active_nvim_run:4:5] b = "0010"
[_active_nvim_run:4:5] b = "0011"
[_active_nvim_run:4:5] b = "0100"
[_active_nvim_run:4:5] b = "0101"
[_active_nvim_run:4:5] b = "0110"
[_active_nvim_run:4:5] b = "0111"
[_active_nvim_run:4:5] b = "1000"
[_active_nvim_run:4:5] b = "1001"
[_active_nvim_run:4:5] b = "1010"
[_active_nvim_run:4:5] b = "1011"
[_active_nvim_run:4:5] b = "1100"
[_active_nvim_run:4:5] b = "1101"
[_active_nvim_run:4:5] b = "1110"
[_active_nvim_run:4:5] b = "1111"
-- end of line --

References