#[derive(Clone, Debug, PartialEq)]
pub struct BinaryFieldDisplay {
raw: u64,
}
impl BinaryFieldDisplay {
pub fn from(raw: u64) -> Self {
Self { raw }
}
pub fn all(&self) -> String {
format!("{:064b}", self.raw)
}
pub fn at(&self, offset: usize, length: usize) -> String {
let value = (self.raw >> offset) & make_mask(length);
let pad = 64 - (offset + length);
if pad == 0 {
format!("{0:>01$b}", value, length)
} else {
format!("{0:>1$}{2:>03$b}", " ", pad, value, length)
}
}
pub fn raw(&self) -> u64 {
self.raw
}
}
fn make_mask(length: usize) -> u64 {
let mut result = 0;
for _ in 0..length {
result = (result << 1) | 1;
}
result
}