pub struct BitArray<B: BitsIn, NBits>where
NBits: Add<<B as BitsIn>::Output> + Unsigned + NonZero,
<NBits as Add<<B as BitsIn>::Output>>::Output: Sub<B1>,
<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output: Div<<B as BitsIn>::Output>,
<<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output as Div<<B as BitsIn>::Output>>::Output: ArrayLength<B>,{ /* private fields */ }
Expand description
The bitarray type.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U10;
let mut bv = BitArray::<u32, U10>::from_elem(false);
// insert all primes less than 10
bv.set(2, true);
bv.set(3, true);
bv.set(5, true);
bv.set(7, true);
println!("{:?}", bv);
println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
// flip all values in bitarray, producing non-primes less than 10
bv.negate();
println!("{:?}", bv);
println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
// reset bitarray to empty
bv.clear();
println!("{:?}", bv);
println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
Implementations§
Source§impl<B: BitsIn + BitBlock + Default, NBits> BitArray<B, NBits>where
NBits: Add<<B as BitsIn>::Output> + Unsigned + NonZero,
<NBits as Add<<B as BitsIn>::Output>>::Output: Sub<B1>,
<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output: Div<<B as BitsIn>::Output>,
<<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output as Div<<B as BitsIn>::Output>>::Output: ArrayLength<B>,
impl<B: BitsIn + BitBlock + Default, NBits> BitArray<B, NBits>where
NBits: Add<<B as BitsIn>::Output> + Unsigned + NonZero,
<NBits as Add<<B as BitsIn>::Output>>::Output: Sub<B1>,
<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output: Div<<B as BitsIn>::Output>,
<<<NBits as Add<<B as BitsIn>::Output>>::Output as Sub<B1>>::Output as Div<<B as BitsIn>::Output>>::Output: ArrayLength<B>,
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates an empty BitArray
.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let mut bv = BitArray::<u32, U8>::new();
Sourcepub fn from_elem(bit: bool) -> Self
pub fn from_elem(bit: bool) -> Self
Creates a BitArray
, setting each element
to bit
.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U10;
let mut bv = BitArray::<u32, U10>::from_elem(false);
assert_eq!(bv.len(), 10);
for x in bv.iter() {
assert_eq!(x, false);
}
Sourcepub fn from_bytes(bytes: &[u8]) -> Self
pub fn from_bytes(bytes: &[u8]) -> Self
Transforms a byte-array into a BitArray
. Each byte becomes eight bits,
with the most significant bits of each byte coming first. Each
bit becomes true
if equal to 1 or false
if equal to 0.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let bv = BitArray::<u32, U8>::from_bytes(&[0b10100000, 0b00010010]);
assert!(bv.eq_vec(&[true, false, true, false,
false, false, false, false,
false, false, false, true,
false, false, true, false]));
Sourcepub fn from_fn<F>(f: F) -> Self
pub fn from_fn<F>(f: F) -> Self
Creates a BitArray
of the specified length where the value at each index
is f(index)
.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U5;
let bv = BitArray::<u32, U5>::from_fn(|i| { i % 2 == 0 });
assert!(bv.eq_vec(&[true, false, true, false, true]));
Sourcepub fn storage(&self) -> &[B]
pub fn storage(&self) -> &[B]
Exposes the raw block storage of this BitArray
Only really intended for BitSet.
Sourcepub unsafe fn storage_mut(&mut self) -> &mut [B]
pub unsafe fn storage_mut(&mut self) -> &mut [B]
Exposes the raw block storage of this BitArray
Can probably cause unsafety. Only really intended for BitSet.
Sourcepub fn get(&self, i: usize) -> Option<bool>
pub fn get(&self, i: usize) -> Option<bool>
Retrieves the value at index i
, or None
if the index is out of bounds.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let bv = BitArray::<u32, U8>::from_bytes(&[0b01100000]);
assert_eq!(bv.get(0), Some(false));
assert_eq!(bv.get(1), Some(true));
assert_eq!(bv.get(100), None);
// Can also use array indexing
assert_eq!(bv[1], true);
Sourcepub fn set_all(&mut self)
pub fn set_all(&mut self)
Sets all bits to 1.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let before = 0b01100000;
let after = 0b11111111;
let mut bv = BitArray::<u32, U8>::from_bytes(&[before]);
bv.set_all();
assert_eq!(bv, BitArray::<u32, U8>::from_bytes(&[after]));
Sourcepub fn negate(&mut self)
pub fn negate(&mut self)
Flips all bits.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let before = 0b01100000;
let after = 0b10011111;
let mut bv = BitArray::<u32, U8>::from_bytes(&[before]);
bv.negate();
assert_eq!(bv, BitArray::<u32, U8>::from_bytes(&[after]));
Sourcepub fn union(&mut self, other: &Self) -> bool
pub fn union(&mut self, other: &Self) -> bool
Calculates the union of two bitarrays. This acts like the bitwise or
function.
Sets self
to the union of self
and other
. Both bitarrays must be
the same length. Returns true
if self
changed.
§Panics
Panics if the bitarrays are of different lengths.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let a = 0b01100100;
let b = 0b01011010;
let res = 0b01111110;
let mut a = BitArray::<u32, U8>::from_bytes(&[a]);
let b = BitArray::<u32, U8>::from_bytes(&[b]);
assert!(a.union(&b));
assert_eq!(a, BitArray::<u32, U8>::from_bytes(&[res]));
Sourcepub fn intersect(&mut self, other: &Self) -> bool
pub fn intersect(&mut self, other: &Self) -> bool
Calculates the intersection of two bitarrays. This acts like the
bitwise and
function.
Sets self
to the intersection of self
and other
. Both bitarrays
must be the same length. Returns true
if self
changed.
§Panics
Panics if the bitarrays are of different lengths.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let a = 0b01100100;
let b = 0b01011010;
let res = 0b01000000;
let mut a = BitArray::<u32, U8>::from_bytes(&[a]);
let b = BitArray::<u32, U8>::from_bytes(&[b]);
assert!(a.intersect(&b));
assert_eq!(a, BitArray::<u32, U8>::from_bytes(&[res]));
Sourcepub fn difference(&mut self, other: &Self) -> bool
pub fn difference(&mut self, other: &Self) -> bool
Calculates the difference between two bitarrays.
Sets each element of self
to the value of that element minus the
element of other
at the same index. Both bitarrays must be the same
length. Returns true
if self
changed.
§Panics
Panics if the bitarrays are of different length.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let a = 0b01100100;
let b = 0b01011010;
let a_b = 0b00100100; // a - b
let b_a = 0b00011010; // b - a
let mut bva = BitArray::<u32, U8>::from_bytes(&[a]);
let bvb = BitArray::<u32, U8>::from_bytes(&[b]);
assert!(bva.difference(&bvb));
assert_eq!(bva, BitArray::<u32, U8>::from_bytes(&[a_b]));
let bva = BitArray::<u32, U8>::from_bytes(&[a]);
let mut bvb = BitArray::<u32, U8>::from_bytes(&[b]);
assert!(bvb.difference(&bva));
assert_eq!(bvb, BitArray::<u32, U8>::from_bytes(&[b_a]));
Sourcepub fn all(&self) -> bool
pub fn all(&self) -> bool
Returns true
if all bits are 1.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let mut bv = BitArray::<u32, U8>::from_elem(true);
assert_eq!(bv.all(), true);
bv.set(1, false);
assert_eq!(bv.all(), false);
Sourcepub fn iter(&self) -> Iter<'_, B, NBits> ⓘ
pub fn iter(&self) -> Iter<'_, B, NBits> ⓘ
Returns an iterator over the elements of the array in order.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U16;
let bv = BitArray::<u32, U16>::from_bytes(&[0b01110100, 0b10010010]);
assert_eq!(bv.iter().filter(|x| *x).count(), 7);
Sourcepub fn none(&self) -> bool
pub fn none(&self) -> bool
Returns true
if all bits are 0.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let mut bv = BitArray::<u32, U8>::from_elem(false);
assert_eq!(bv.none(), true);
bv.set(3, true);
assert_eq!(bv.none(), false);
Sourcepub fn any(&self) -> bool
pub fn any(&self) -> bool
Returns true
if any bit is 1.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let mut bv = BitArray::<u32, U8>::from_elem(false);
assert_eq!(bv.any(), false);
bv.set(3, true);
assert_eq!(bv.any(), true);
Sourcepub fn to_bytes(&self) -> Vec<u8> ⓘ
pub fn to_bytes(&self) -> Vec<u8> ⓘ
Organises the bits into bytes, such that the first bit in the
BitArray
becomes the high-order bit of the first byte. If the
size of the BitArray
is not a multiple of eight then trailing bits
will be filled-in with false
.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::{U3, U9};
let mut bv = BitArray::<u32, U3>::from_elem(true);
bv.set(1, false);
assert_eq!(bv.to_bytes(), [0b10100000]);
let mut bv = BitArray::<u32, U9>::from_elem(false);
bv.set(2, true);
bv.set(8, true);
assert_eq!(bv.to_bytes(), [0b00100000, 0b10000000]);
Sourcepub fn eq_vec(&self, v: &[bool]) -> bool
pub fn eq_vec(&self, v: &[bool]) -> bool
Compares a BitArray
to a slice of bool
s.
Both the BitArray
and slice must have the same length.
§Panics
Panics if the BitArray
and slice are of different length.
§Examples
extern crate typenum;
use bit_array::BitArray;
use typenum::U8;
let bv = BitArray::<u32, U8>::from_bytes(&[0b10100000]);
assert!(bv.eq_vec(&[true, false, true, false,
false, false, false, false]));