Skip to content

contain-rs/bit-vec

Folders and files

NameName
Last commit message
Last commit date
Apr 16, 2022
Jul 16, 2024
May 31, 2024
Jan 25, 2025
Feb 13, 2023
May 16, 2019
Jul 16, 2024
Jun 3, 2015
Feb 13, 2023
Jul 16, 2024
Jul 16, 2024
Aug 18, 2015

Repository files navigation

bit-vec

A compact vector of bits.

crates.io Documentation Rust CI rustc 1.0+ serde_derive: rustc 1.31+

Dependency Status Download Status

Usage

Add this to your Cargo.toml:

[dependencies]
bit-vec = "0.8"

Since Rust 2018, extern crate is no longer mandatory. If your edition is old (Rust 2015), add this to your crate root:

extern crate bit_vec;

If you want serde support, include the feature like this:

[dependencies]
bit-vec = { version = "0.8", features = ["serde"] }

If you want to use bit-vec in a program that has #![no_std], just drop default features:

[dependencies]
bit-vec = { version = "0.8", default-features = false }

If you want to use serde with the alloc crate instead of std, just use the serde_no_std feature:

[dependencies]
bit-vec = { version = "0.8", default-features = false, features = ["serde", "serde_no_std"] }

If you want borsh-rs support, include it like this:

[dependencies]
bit-vec = { version = "0.8", features = ["borsh"] }

Other available serialization libraries can be enabled with the miniserde and nanoserde features.

Description

Dynamic collections implemented with compact bit vectors.

Examples

This is a simple example of the Sieve of Eratosthenes which calculates prime numbers up to a given limit.

use bit_vec::BitVec;

let max_prime = 10000;

// Store the primes as a BitVec
let primes = {
    // Assume all numbers are prime to begin, and then we
    // cross off non-primes progressively
    let mut bv = BitVec::from_elem(max_prime, true);

    // Neither 0 nor 1 are prime
    bv.set(0, false);
    bv.set(1, false);

    for i in 2.. 1 + (max_prime as f64).sqrt() as usize {
        // if i is a prime
        if bv[i] {
            // Mark all multiples of i as non-prime (any multiples below i * i
            // will have been marked as non-prime previously)
            for j in i.. {
                if i * j >= max_prime {
                    break;
                }
                bv.set(i * j, false)
            }
        }
    }
    bv
};

// Simple primality tests below our max bound
let print_primes = 20;
print!("The primes below {} are: ", print_primes);
for x in 0..print_primes {
    if primes.get(x).unwrap_or(false) {
        print!("{} ", x);
    }
}
println!();

let num_primes = primes.iter().filter(|x| *x).count();
println!("There are {} primes below {}", num_primes, max_prime);
assert_eq!(num_primes, 1_229);

License

Dual-licensed for compatibility with the Rust project.

Licensed under the Apache License Version 2.0: http://www.apache.org/licenses/LICENSE-2.0, or the MIT license: http://opensource.org/licenses/MIT, at your option.