struct BitSet {
bits: Vec<u8>,
size: usize,
}
impl BitSet {
fn new(size: usize) -> Self {
let num_bytes = (size + 7) / 8; // Calculate the number of bytes needed
BitSet {
bits: vec![0; num_bytes],
size,
}
}
fn set(&mut self, index: usize) {
if index < self.size {
let byte_index = index / 8;
let bit_index = index % 8;
self.bits[byte_index] |= 1 << bit_index;
}
}
fn clear(&mut self, index: usize) {
if index < self.size {
let byte_index = index / 8;
let bit_index = index % 8;
self.bits[byte_index] &= !(1 << bit_index);
}
}
fn is_set(&self, index: usize) -> bool {
if index < self.size {
let byte_index = index / 8;
let bit_index = index % 8;
(self.bits[byte_index] & (1 << bit_index)) != 0
} else {
false
}
}
// Function to print the bitset as 0s and 1s in reverse order
fn print(&self) {
for i in (0..self.size).rev() { // Iterate in reverse order
print!("{}", if self.is_set(i) { "1" } else { "0" });
}
println!();
}
}
fn main() {
let mut bitset = BitSet::new(16);
bitset.set(3);
bitset.set(7);
bitset.set(15);
println!("BitSet:");
bitset.print();
bitset.clear(7);
println!("BitSet after clearing bit 7:");
bitset.print();
}
/*
run:
BitSet:
1000000010001000
BitSet after clearing bit 7:
1000000000001000
*/