GF2++
Loading...
Searching...
No Matches
gf2::BitVec< Word >

A dynamically-sized vector over GF(2) with bit elements compactly stored in a standard vector of primitive unsigned words whose type is given by the template parameter Word. More...

#include <BitVec.h>

Inheritance diagram for gf2::BitVec< Word >:
gf2::BitStore< BitVec< usize > >

Public Types

using word_type = Word
 The underlying unsigned word type used to store the bits.

Public Member Functions

BitStore Required Methods.
constexpr usize size () const
 Returns the number of bit-elements in the bit-vector.
constexpr usize words () const
 Returns the number of words in the bit-vector's underlying word store.
constexpr Word word (usize i) const
 Returns word i from the bit-vector's underlying word store.
constexpr void set_word (usize i, Word word)
 Sets word i in the bit-vector's underlying word store to value (masked if necessary).
constexpr const Word * data () const
 Returns a const pointer to the underlying store of words .
constexpr Word * data ()
 Returns a pointer to the underlying store of words.
constexpr u8 offset () const
 Returns the offset (in bits) of the first bit in the store within the first word.
Constructors
constexpr BitVec (usize len=0)
 Constructs a bit-vector of length n with all the bit elements set to 0.
constexpr BitVec (usize len, Word word)
 Constructs a bit-vector with len elements by repeatedly copying all the bits from word.
Size and Capacity
constexpr usize capacity () const
 Returns the current capacity of the bit-vector.
constexpr BitVecshrink_to_fit ()
 Shrinks the bit-vector's capacity as much as possible.
constexpr BitVecclear ()
 Removes all elements from the bit-vector so size()==0.
constexpr BitVecresize (usize n)
 Resize the bit-vector so that its size() is n.
constexpr void clean ()
 Sets any unused bits in the last occupied word to 0.
Appending BitsIter
constexpr BitVecpush (bool b)
 Pushes a single bit b onto the bit-vector.
template<unsigned_word Src>
auto append (Src src)
 Appends all the bits from any unsigned integral src value and returns a reference to this for chaining.
template<typename Src>
constexpr BitVecappend (const BitStore< Src > &src)
 Appends all the bits from any BitStore src onto the end of the bit-vector and returns this for chaining.
template<usize N>
auto append (const std::bitset< N > &src)
 Appends all the bits from a std::bitset onto the end of the bit-vector and returns this for chaining.
constexpr BitVecappend_digit (char c, int base)
 Appends a single character c onto the end of bit-vector and returns this for chaining.
constexpr BitVecappend_hex_digit (char c)
 Appends a single hex digit character c onto the end of bit-vector and returns this for chaining.
Removing BitsIter
constexpr std::optional< bool > pop ()
 Removes the last bit from the bit-vector and returns it or std::nullopt if the bit-vector is empty.
constexpr void split_off (usize at, BitVec< Word > &dst)
 Splits a bit-vector into two at the given index, returning the second part in dst.
constexpr BitVec< Word > split_off (usize at)
 Splits a bit-vector into two at the given index, returning a new BitVec.
template<unsigned_word Dst = Word>
constexpr std::optional< Dst > split_off_unsigned ()
 Split off a single arbitrary sized unsigned integer off the end of the bit-vector and returns it or std::nullopt if the bit-vector is empty.
Required methods:

The BitStore subclasses implement the following methods ...

constexpr void set_word (usize i, word_type value)
 This method sets "word" at index i to the specified value.
Individual bit reads:
constexpr bool get (usize i) const
 Returns true if the bit at the given index i is set, false otherwise.
constexpr bool operator[] (usize index) const
 Returns the boolean value of the bit element at index.
constexpr bool front () const
 Returns true if the first bit element is set, false otherwise.
constexpr bool back () const
 Returns true if the last bit element is set, false otherwise.
Individual bit mutators:
auto set (usize index, bool value=true)
 Sets the bit-element at the given index to the specified boolean value & returns this for chaining. The default value for value is true.
auto flip (usize index)
 Flips the value of the bit-element at the given index and returns this for chaining/.
constexpr auto swap (usize i0, usize i1)
 Swaps the bits in the bit-store at indices i0 and i1 and returns this for chaining.
Store queries:
constexpr bool is_empty () const
 Returns true if the store is empty, false otherwise.
constexpr bool any () const
 Returns true if at least one bit in the store is set, false otherwise.
constexpr bool all () const
 Returns true if all bits in the store are set, false otherwise.
constexpr bool none () const
 Returns true if no bits in the store are set, false otherwise.
Store mutators:
auto set_all (bool value=true)
 Sets the bits in the store to the boolean value and returns a reference to this for chaining.
auto flip_all ()
 Flips the value of the bits in the store and returns a reference to this for chaining.
Store fills:
auto copy (Src src)
 Copies the bits from an unsigned integral src value and returns a reference to this for chaining.
auto fill (std::invocable< usize > auto f)
 Fill the store by repeatedly calling f(i) and returns a reference to this for chaining.
auto random_fill (double p=0.5, u64 seed=0)
 Fill the store with random bits and returns a reference to this for chaining.
Bit counts:
constexpr usize count_ones () const
 Returns the number of set bits in the store.
constexpr usize count_zeros () const
 Returns the number of unset bits in the store.
constexpr usize leading_zeros () const
 Returns the number of leading zeros in the store.
constexpr usize trailing_zeros () const
 Returns the number of trailing zeros in the store.
Set bit indices:
std::optional< usizefirst_set () const
 Returns the index of the first set bit in the bit-store or {} if no bits are set.
std::optional< usizelast_set () const
 Returns the index of the last set bit in the bit-store or {} if no bits are set.
std::optional< usizenext_set (usize index) const
 Returns the index of the next set bit after index in the store or {} if no more set bits exist.
std::optional< usizeprevious_set (usize index) const
 Returns the index of the previous set bit before index in the store or {} if there are none.
Unset bit indices:
std::optional< usizefirst_unset () const
 Returns the index of the first unset bit in the bit-store or {} if no bits are unset.
std::optional< usizelast_unset () const
 Returns the index of the last unset bit in the bit-store or {} if no bits are unset.
std::optional< usizenext_unset (usize index) const
 Returns the index of the next unset bit after index in the store or {} if no more unset bits exist.
std::optional< usizeprevious_unset (usize index) const
 Returns the index of the previous unset bit before index in the store or {} if no more unset bits exist.
Iterators:
constexpr auto bits () const
 Returns a const iterator over the bool values of the bits in the const bit-store.
constexpr auto set_bit_indices () const
 Returns an iterator over the indices of any set bits in the bit-store.
constexpr auto unset_bit_indices () const
 Returns an iterator over the indices of any unset bits in the bit-store.
constexpr auto store_words () const
 Returns a const iterator over all the words underlying the bit-store.
constexpr auto to_words () const
 Returns a copy of the words underlying this bit-store.
Spans:
constexpr auto span (usize begin, usize end) const
 Returns an immutable bit-span encompassing the bits in the half-open range [begin, end).
Sub-vectors:
constexpr auto sub (usize begin, usize end) const
 Returns a clone of the elements in the half-open range [begin, end) as a new bit-vector.
constexpr void split_at (usize at, BitVec< word_type > &left, BitVec< word_type > &right) const
 Views a bit-store as two parts containing the elements [0, at) and [at, size()) respectively.
Riffling:
constexpr void riffle_into (BitVec< word_type > &dst) const
 Interleaves the bits of this bit-store with zeros storing the result into the bit-vector dst.
constexpr auto riffled () const
 Returns a new bit-vector that is the result of riffling the bits in this bit-store with zeros.
Bit shifts:
constexpr void operator<<= (usize shift)
 In-place left shift of the bit-store by shift bits.
constexpr void operator>>= (usize shift)
 In-place right shift of the bit-store by shift bits.
constexpr auto operator<< (usize shift) const
 Returns a new bit-vector that is lhs shifted left by shift bits.
constexpr auto operator>> (usize shift) const
 Returns a new bit-vector that is lhs shifted right by shift bits.
Bit-wise operations:
void operator^= (const BitStore< Rhs > &rhs)
 In-place XOR with another equal-sized bit-store.
void operator&= (const BitStore< Rhs > &rhs)
 In-place AND with another equal-sized bit-store.
void operator|= (const BitStore< Rhs > &rhs)
 In-place OR with another equal-sized bit-store.
auto operator~ () const
 Returns a new bit-vector that has the same bits as the current bit-store but with all the bits flipped.
auto operator^ (const BitStore< Rhs > &rhs) const
 Returns a new bit-vector that is the XOR of the current bit-store and another equal-sized bit-store.
auto operator& (const BitStore< Rhs > &rhs) const
 Returns a new bit-vector that is the AND of the current bit-store and another equal-sized bit-store.
auto operator| (const BitStore< Rhs > &rhs) const
 Returns a new bit-vector that is the OR of the current bit-store and another equal-sized bit-store.
Arithmetic operations:
void operator+= (const BitStore< Rhs > &rhs)
 In-place addition of this bit-store with the an equal-sized rhs bit-store.
void operator-= (const BitStore< Rhs > &rhs)
 In-place subtraction of this bit-store with the an equal-sized rhs bit-store.
auto operator+ (const BitStore< Rhs > &rhs) const
 Returns a new bit-vector that is the + of this store with the passed (equal-sized) rhs bit-store.
auto operator- (const BitStore< Rhs > &rhs) const
 Returns a new bit-vector that is the - of this store with the passed (equal-sized) rhs bit-store.
String representations:
std::string to_string (std::string_view sep="", std::string_view pre="", std::string_view post="") const
 Returns a binary string representation of the store.
std::string to_pretty_string () const
 Returns a "pretty" string representation of the store.
std::string to_binary_string (std::string_view sep="", std::string_view pre="", std::string_view post="") const
 Returns a binary string representation of the store.
std::string to_hex_string () const
 Returns the "hex" string representation of the bits in the bit-store.
std::string describe () const
 Returns a multi-line string describing the bit-vector in some detail.

Static Public Member Functions

Factory Constructors
static constexpr BitVec with_capacity (usize capacity)
 Factory method to construct an empty bit-vector with at least the specified capacity.
static constexpr BitVec zeros (usize n)
 Factory method to generate a bit-vector of length n where the elements are all 0.
static constexpr BitVec ones (usize n)
 Factory method to generate a bit-vector of length n where the elements are all 1.
static constexpr BitVec constant (usize n, bool value)
 Factory method to generate a bit-vector of length n where the elements are set to value.
static constexpr BitVec unit (usize n, usize i)
 Factory method to generate a "unit" bit-vector of length n where only element i is set.
static constexpr BitVec alternating (usize n)
 Factory method to generate a bit-vector of length n looking like 101010....
template<typename Src>
static constexpr BitVec from (const BitStore< Src > &src)
 Factory method to construct a bit-vector by copying all the bits from any BitStore instance.
template<usize N>
static constexpr BitVec from (const std::bitset< N > &src)
 Factory method to construct a bit-vector from the bits of a std::bitset.
static constexpr BitVec from (usize len, std::invocable< usize > auto f)
 Factory method to construct a bit-vector by repeatedly calling f(i) for i in [0, len).
Random Bit-Vector Constructors
static BitVec random (usize len, double p=0.5, u64 seed=0)
 Factory method to generate a bit-vector of size len where the elements are picked at random.
static BitVec seeded_random (usize len, u64 seed)
 Factory method to generate a bit-vector of size len where the elements are from independent fair coin flips generated from an RNG seeded with the given seed.
static BitVec biased_random (usize len, double p)
 Factory method to generate a bit-vector of size len where the elements are from independent fair coin flips and where each bit is 1 with probability p.
Constructors from Strings
static std::optional< BitVecfrom_string (std::string_view sv)
 Factory method to construct a bit-vector from a string s, returning std::nullopt on failure.
static std::optional< BitVecfrom_binary_string (std::string_view sv, bool no_punctuation=false)
 Factory method to construct a bit-vector from a binary string, returning std::nullopt on failure.
static std::optional< BitVecfrom_hex_string (std::string_view sv, bool no_punctuation=false)
 Factory method to construct a bit-vector from a hex string, returning std::nullopt on failure.

Static Public Attributes

static constexpr u8 bits_per_word = BITS<Word>
 The number of bits per Word.

Detailed Description

template<unsigned_word Word = usize>
class gf2::BitVec< Word >

A dynamically-sized vector over GF(2) with bit elements compactly stored in a standard vector of primitive unsigned words whose type is given by the template parameter Word.

The BitVec class inherits from the base gf2::BitStore class. We implement a small number of required methods and then inherit the majority of our functionality from that base.

Note
Inheritance is done using the CRTP to avoid all runtime virtual method dispatch overhad..

Constructor & Destructor Documentation

◆ BitVec() [1/2]

template<unsigned_word Word = usize>
gf2::BitVec< Word >::BitVec ( usize len = 0)
inlineexplicitconstexpr

Constructs a bit-vector of length n with all the bit elements set to 0.

The bit elements are compactly packed into a a standard vector of unsigned words. The template parameter Word sets the type of those words. It has a reasonable default type that works for most cases.

Note
The default constructor returns the empty bit-vector with no elements.

Example

BitVec v0;
assert_eq(v0.to_string(), "");
BitVec<u8> v1{10};
assert_eq(v1.to_string(), "0000000000");
std::string to_string(std::string_view sep="", std::string_view pre="", std::string_view post="") const
Returns a binary string representation of the store.
Definition BitStore.h:1606
constexpr BitVec(usize len=0)
Constructs a bit-vector of length n with all the bit elements set to 0.
Definition BitVec.h:166

◆ BitVec() [2/2]

template<unsigned_word Word = usize>
gf2::BitVec< Word >::BitVec ( usize len,
Word word )
inlineexplicitconstexpr

Constructs a bit-vector with len elements by repeatedly copying all the bits from word.

You specify the length len of the bit-vector which means the final copy of word may be truncated and padded with zeros (unused bit slots are always set to zero in this library).

Example

BitVec<u8> v{10, u8{0b0101'0101}};
assert_eq(v.size(), 10);
assert_eq(v.to_string(), "1010101010");
constexpr usize size() const
Returns the number of bit-elements in the bit-vector.
Definition BitVec.h:64
std::uint8_t u8
Word type alias for an 8-bit unsigned integer.
Definition unsigned_word.h:29

Member Function Documentation

◆ all()

bool gf2::BitStore< BitVec< usize > >::all ( ) const
inlineconstexprinherited

Returns true if all bits in the store are set, false otherwise.

Note
Empty stores have no set bits (logical connective for all is AND with identity true).

Example

BitVec v{3};
assert_eq(v.all(), false);
v.set(0);
v.set(1);
v.set(2);
assert_eq(v.all(), true);
constexpr bool all() const
Returns true if all bits in the store are set, false otherwise.
Definition BitStore.h:327
auto set(usize index, bool value=true)
Sets the bit-element at the given index to the specified boolean value & returns this for chaining....
Definition BitStore.h:191

◆ alternating()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::alternating ( usize n)
inlinestaticconstexpr

Factory method to generate a bit-vector of length n looking like 101010....

Example

assert_eq(BitVec<u8>::alternating(10).to_string(), "1010101010");
static constexpr BitVec alternating(usize n)
Factory method to generate a bit-vector of length n looking like 101010....
Definition BitVec.h:255

◆ any()

bool gf2::BitStore< BitVec< usize > >::any ( ) const
inlineconstexprinherited

Returns true if at least one bit in the store is set, false otherwise.

Note
Empty stores have no set bits (logical connective for any is OR with identity false).

Example

BitVec v{10};
assert_eq(v.any(), false);
v.set(0);
assert_eq(v.any(), true);
constexpr bool any() const
Returns true if at least one bit in the store is set, false otherwise.
Definition BitStore.h:308

◆ append() [1/3]

template<unsigned_word Word = usize>
template<typename Src>
BitVec & gf2::BitVec< Word >::append ( const BitStore< Src > & src)
inlineconstexpr

Appends all the bits from any BitStore src onto the end of the bit-vector and returns this for chaining.

Note
Generally, we do not support interactions between bit-stores that use different underlying unsigned word types. This method is an exception, and the src bit-store may use a different unsigned type from the one used here.

Example

auto v = BitVec<u8>::zeros(10);
auto w = BitVec<u16>::ones(10);
v.append(w);
assert_eq(v.size(), 20);
assert_eq(v.to_string(), "00000000001111111111");
static constexpr BitVec zeros(usize n)
Factory method to generate a bit-vector of length n where the elements are all 0.
Definition BitVec.h:212
static constexpr BitVec ones(usize n)
Factory method to generate a bit-vector of length n where the elements are all 1.
Definition BitVec.h:220

◆ append() [2/3]

template<unsigned_word Word = usize>
template<usize N>
auto gf2::BitVec< Word >::append ( const std::bitset< N > & src)
inline

Appends all the bits from a std::bitset onto the end of the bit-vector and returns this for chaining.

Example

std::bitset<10> src{0b1010101010};
v.append(src);
assert_eq(v.to_string(), "0101010101");
A dynamically-sized vector over GF(2) with bit elements compactly stored in a standard vector of prim...
Definition BitVec.h:37
auto append(Src src)
Appends all the bits from any unsigned integral src value and returns a reference to this for chainin...
Definition BitVec.h:634

◆ append() [3/3]

template<unsigned_word Word = usize>
template<unsigned_word Src>
auto gf2::BitVec< Word >::append ( Src src)
inline

Appends all the bits from any unsigned integral src value and returns a reference to this for chaining.

Note
We allow any unsigned integral source, e.g. appending a single u16 into a BitVec<u8>.

Example

auto v = BitVec<u8>::ones(4);
u16 src = 0b1010101010101010;
v.append(src);
assert_eq(v.to_string(), "11110101010101010101");
auto w = BitVec<u32>::ones(4);
w.append(src);
assert_eq(w.to_string(), "11110101010101010101");
std::uint16_t u16
Word type alias for a 16-bit unsigned integer.
Definition unsigned_word.h:32

◆ append_digit()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::append_digit ( char c,
int base )
inlineconstexpr

Appends a single character c onto the end of bit-vector and returns this for chaining.

The character is interpreted as a base base number wherebase must be one of 2, 4, 8, 16.

Note
This method does nothing if the base or character is not recognized.

Example

v.append_digit('A', 16);
assert_eq(v.to_string(), "1010");
v.append_digit('X', 16);
assert_eq(v.to_string(), "1010");
v.append_digit('1', 8);
assert_eq(v.to_string(), "1010001");
v.append_digit('1', 4);
assert_eq(v.to_string(), "101000101");
v.append_digit('1', 2);
assert_eq(v.to_string(), "1010001011");
constexpr BitVec & append_digit(char c, int base)
Appends a single character c onto the end of bit-vector and returns this for chaining.
Definition BitVec.h:700

◆ append_hex_digit()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::append_hex_digit ( char c)
inlineconstexpr

Appends a single hex digit character c onto the end of bit-vector and returns this for chaining.

Note
This method does nothing if the character is not a hex digit.

This is the same as append_digit(c, 16) but we push hex digits more often than other bases and want to skip some checks for efficiency.

Example

assert_eq(v.to_string(), "1111");
assert_eq(v.to_string(), "1111");
assert_eq(v.to_string(), "11110001");
constexpr BitVec & append_hex_digit(char c)
Appends a single hex digit character c onto the end of bit-vector and returns this for chaining.
Definition BitVec.h:734

◆ back()

bool gf2::BitStore< BitVec< usize > >::back ( ) const
inlineconstexprinherited

Returns true if the last bit element is set, false otherwise.

Note
In debug mode the method panics of the store is empty.

Example

auto v = BitVec<>::ones(10);
assert_eq(v.back(), true);
v.set_all(false);
assert_eq(v.back(), false);

◆ biased_random()

template<unsigned_word Word = usize>
BitVec gf2::BitVec< Word >::biased_random ( usize len,
double p )
inlinestatic

Factory method to generate a bit-vector of size len where the elements are from independent fair coin flips and where each bit is 1 with probability p.

Parameters
lenThe length of the bit-vector to generate.
pThe probability of the elements being 1.

Example

auto u = BitVec<>::biased_random(10, 0.3);
auto v = BitVec<>::biased_random(10, 0.3);
assert_eq(u.size(), v.size());
static BitVec biased_random(usize len, double p)
Factory method to generate a bit-vector of size len where the elements are from independent fair coin...
Definition BitVec.h:376

◆ bits()

auto gf2::BitStore< BitVec< usize > >::bits ( ) const
inlineconstexprinherited

Returns a const iterator over the bool values of the bits in the const bit-store.

You can use this iterator to iterate over the bits in the store and get the values of each bit as a bool.

Note
For the most part, try to avoid iterating through individual bits. It is much more efficient to use methods that work on whole words of bits at a time.

Example

auto u = BitVec<u8>::ones(10);
for (auto&& bit : u.bits()) assert_eq(bit, true);

◆ capacity()

template<unsigned_word Word = usize>
usize gf2::BitVec< Word >::capacity ( ) const
inlineconstexpr

Returns the current capacity of the bit-vector.

This is the total number of bits that the bit-vector can hold without allocating more memory. The number includes the number of bits already in use.

Example

BitVec v0;
assert_eq(v0.capacity(), 0);
BitVec<u64> v1(10);
assert_eq(v1.capacity(), 64);
constexpr usize capacity() const
Returns the current capacity of the bit-vector.
Definition BitVec.h:535

◆ clean()

template<unsigned_word Word = usize>
void gf2::BitVec< Word >::clean ( )
inlineconstexpr

Sets any unused bits in the last occupied word to 0.

This is used to enforce the guarantee that unused bits in the store are always set to 0.

◆ clear()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::clear ( )
inlineconstexpr

Removes all elements from the bit-vector so size()==0.

The capacity is not changed by this operation.

◆ constant()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::constant ( usize n,
bool value )
inlinestaticconstexpr

Factory method to generate a bit-vector of length n where the elements are set to value.

Example

auto v = BitVec<>::constant(10, true);
assert_eq(v.to_string(), "1111111111");
auto w = BitVec<>::constant(10, false);
assert_eq(w.to_string(), "0000000000");
static constexpr BitVec constant(usize n, bool value)
Factory method to generate a bit-vector of length n where the elements are set to value.
Definition BitVec.h:231

◆ copy()

auto gf2::BitStore< BitVec< usize > >::copy ( Src src)
inlineinherited

Copies the bits from an unsigned integral src value and returns a reference to this for chaining.

Notes:

  1. The size of the store must match the number of bits in the source type.
  2. We allow any unsigned integral source, e.g. copying a single u64 into a BitVec<u8> of size 64.
  3. The least-significant bit of the source becomes the bit at index 0 in the store.

Example

BitVec<u8> v{16};
u16 src = 0b1010101010101010;
v.copy(src);
assert_eq(v.to_string(), "0101010101010101");
w.copy(src);
assert_eq(w.to_string(), "0101010101010101");
auto copy(Src src)
Copies the bits from an unsigned integral src value and returns a reference to this for chaining.
Definition BitStore.h:412

◆ count_ones()

usize gf2::BitStore< BitVec< usize > >::count_ones ( ) const
inlineconstexprinherited

Returns the number of set bits in the store.

Example

BitVec v{10};
assert_eq(v.count_ones(), 0);
v.set(0);
assert_eq(v.count_ones(), 1);
constexpr usize count_ones() const
Returns the number of set bits in the store.
Definition BitStore.h:601

◆ count_zeros()

usize gf2::BitStore< BitVec< usize > >::count_zeros ( ) const
inlineconstexprinherited

Returns the number of unset bits in the store.

Example

BitVec v{10};
assert_eq(v.count_zeros(), 10);
v.set(0);
assert_eq(v.count_zeros(), 9);
constexpr usize count_zeros() const
Returns the number of unset bits in the store.
Definition BitStore.h:616

◆ data() [1/2]

template<unsigned_word Word = usize>
Word * gf2::BitVec< Word >::data ( )
inlineconstexpr

Returns a pointer to the underlying store of words.

Note
The pointer is non-const but you should be careful about using it to modify the words in the store.

Example

auto v = BitVec<u8>::ones(10);
auto ptr = v.data();
assert_eq(*ptr, 0b1111'1111);

◆ data() [2/2]

template<unsigned_word Word = usize>
const Word * gf2::BitVec< Word >::data ( ) const
inlineconstexpr

Returns a const pointer to the underlying store of words .

Example

auto v = BitVec<u8>::ones(10);
auto ptr = v.data();
assert_eq(*ptr, 0b1111'1111);

◆ describe()

std::string gf2::BitStore< BitVec< usize > >::describe ( ) const
inlineinherited

Returns a multi-line string describing the bit-vector in some detail.

This method is useful for debugging but you should not rely on the output format which may change.

◆ fill()

auto gf2::BitStore< BitVec< usize > >::fill ( std::invocable< usize > auto f)
inlineinherited

Fill the store by repeatedly calling f(i) and returns a reference to this for chaining.

Example

BitVec v{10};
v.fill([](usize i) { return i % 2 == 0; });
assert_eq(v.size(), 10);
assert_eq(v.to_string(), "1010101010");
auto fill(std::invocable< usize > auto f)
Fill the store by repeatedly calling f(i) and returns a reference to this for chaining.
Definition BitStore.h:536
std::size_t usize
Word type alias for the platform's "native"-sized unsigned integer.
Definition unsigned_word.h:41

◆ first_set()

std::optional< usize > gf2::BitStore< BitVec< usize > >::first_set ( ) const
inlineinherited

Returns the index of the first set bit in the bit-store or {} if no bits are set.

Example

auto v = BitVec<u8>::zeros(37);
assert(v.first_set() == std::optional<usize>{});
v.set(2);
assert(v.first_set() == std::optional<usize>{2});
v.set(2, false);
assert(v.first_set() == std::optional<usize>{});
v.set(27);
assert(v.first_set() == std::optional<usize>{27});
BitVec empty;
assert(empty.first_set() == std::optional<usize>{});
std::optional< usize > first_set() const
Returns the index of the first set bit in the bit-store or {} if no bits are set.
Definition BitStore.h:684

◆ first_unset()

std::optional< usize > gf2::BitStore< BitVec< usize > >::first_unset ( ) const
inlineinherited

Returns the index of the first unset bit in the bit-store or {} if no bits are unset.

Example

auto v = BitVec<u8>::ones(37);
assert(v.first_unset() == std::optional<usize>{});
v.set(2, false);
assert(v.first_unset() == std::optional<usize>{2});
v.set(2);
assert(v.first_unset() == std::optional<usize>{});
v.set(27, false);
assert(v.first_unset() == std::optional<usize>{27});
BitVec empty;
assert(empty.first_unset() == std::optional<usize>{});
std::optional< usize > first_unset() const
Returns the index of the first unset bit in the bit-store or {} if no bits are unset.
Definition BitStore.h:803

◆ flip()

auto gf2::BitStore< BitVec< usize > >::flip ( usize index)
inlineinherited

Flips the value of the bit-element at the given index and returns this for chaining/.

Note
In debug mode the index is bounds-checked.

Example

auto v = BitVec<u8>::ones(10);
v.flip(0);
assert_eq(v.to_string(), "0111111111");
v.flip(1);
assert_eq(v.to_string(), "0011111111");
v.flip(9);
assert_eq(v.to_string(), "0011111110");

◆ flip_all()

auto gf2::BitStore< BitVec< usize > >::flip_all ( )
inlineinherited

Flips the value of the bits in the store and returns a reference to this for chaining.

Example

auto v = BitVec<u8>::zeros(10);
v.flip_all();
assert_eq(v.to_string(), "1111111111");

◆ from() [1/3]

template<unsigned_word Word = usize>
template<typename Src>
constexpr BitVec gf2::BitVec< Word >::from ( const BitStore< Src > & src)
inlinestaticconstexpr

Factory method to construct a bit-vector by copying all the bits from any BitStore instance.

Note

Generally, we do not support interactions between bit-stores that use different underlying unsigned word types. This method is an exception – the src bit-store may use a different unsigned type from the one used here. It makes it possible to convert between bit-vector types which is occasionally useful.

Example

assert_eq(v.size(), 10);
assert_eq(v.to_string(), "1111111111");
assert_eq(w.size(), 20);
assert_eq(w.to_string(), "11111111111111111111");
assert_eq(x.size(), 10);
assert_eq(x.to_string(), "0000000000");
static constexpr BitVec from(const BitStore< Src > &src)
Factory method to construct a bit-vector by copying all the bits from any BitStore instance.
Definition BitVec.h:277

◆ from() [2/3]

template<unsigned_word Word = usize>
template<usize N>
constexpr BitVec gf2::BitVec< Word >::from ( const std::bitset< N > & src)
inlinestaticconstexpr

Factory method to construct a bit-vector from the bits of a std::bitset.

Note
std::bitset prints its bit elements in bit-order ...b2b1b0., we print in vector-order b0b1b2...

Example

std::bitset<10> src{0b1010101010};
auto v = BitVec<>::from(src);
assert_eq(v.to_string(), "0101010101");

◆ from() [3/3]

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::from ( usize len,
std::invocable< usize > auto f )
inlinestaticconstexpr

Factory method to construct a bit-vector by repeatedly calling f(i) for i in [0, len).

Parameters
lenThe length of the bit-vector to generate.
fThe function to call for each index i in [0, len).

Example

auto v = BitVec<u8>::from(10, [](usize i) { return i % 2 == 0; });
assert_eq(v.size(), 10);
assert_eq(v.to_string(), "1010101010");

◆ from_binary_string()

template<unsigned_word Word = usize>
std::optional< BitVec > gf2::BitVec< Word >::from_binary_string ( std::string_view sv,
bool no_punctuation = false )
inlinestatic

Factory method to construct a bit-vector from a binary string, returning std::nullopt on failure.

The string can contain whitespace, commas, single quotes, and underscores. If the second argument is true, then the string is assumed to have none of the above characters. There can always be a "0b" prefix.

Example

auto v = BitVec<u8>::from_binary_string("0b1010'1010'10");
assert_eq(v->to_string(), "1010101010");
assert_eq(u->to_string(), "");
static std::optional< BitVec > from_binary_string(std::string_view sv, bool no_punctuation=false)
Factory method to construct a bit-vector from a binary string, returning std::nullopt on failure.
Definition BitVec.h:439

◆ from_hex_string()

template<unsigned_word Word = usize>
std::optional< BitVec > gf2::BitVec< Word >::from_hex_string ( std::string_view sv,
bool no_punctuation = false )
inlinestatic

Factory method to construct a bit-vector from a hex string, returning std::nullopt on failure.

The hex string should consist of the characters 0-9, A-F, a-f, with an optional prefix "0x" or "0X". The string may also have a suffix of the form ".base" where base is one of 2, 4 or 8 which indicates that the last digit should be interpreted as a base base number. This allows for bit-vectors whose length is not a multiple of 4.

Example

auto v1 = gf2::BitVec<>::from_hex_string("0xAA").value();
assert_eq(v1.to_string(), "10101010");
auto v2 = gf2::BitVec<>::from_hex_string("0x1").value();
assert_eq(v2.to_string(), "0001");
auto v3 = gf2::BitVec<>::from_hex_string("0x1.8").value();
assert_eq(v3.to_string(), "001");
auto v4 = gf2::BitVec<>::from_hex_string("0x1.4").value();
assert_eq(v4.to_string(), "01");
auto v5 = gf2::BitVec<>::from_hex_string("0x1.2").value();
assert_eq(v5.to_string(), "1");
static std::optional< BitVec > from_hex_string(std::string_view sv, bool no_punctuation=false)
Factory method to construct a bit-vector from a hex string, returning std::nullopt on failure.
Definition BitVec.h:480

◆ from_string()

template<unsigned_word Word = usize>
std::optional< BitVec > gf2::BitVec< Word >::from_string ( std::string_view sv)
inlinestatic

Factory method to construct a bit-vector from a string s, returning std::nullopt on failure.

The string can contain whitespace, commas, single quotes, and underscores and optionally a "0b", "0x", or "0X" prefix. If there is no prefix, and the string only contains '0' and '1' characters, we assume the string is binary. To force getting it interpreted as a hex string, add a prefix of "0x" or "0X".

A hex string can have a suffix of ".2", ".4", or ".8" to indicate the base of the last digit/character. This allows for bit-vectors of any length as opposed to just a multiple of 4.

Example

auto v1 = BitVec<>::from_string("0b1010_1010_10").value();
assert_eq(v1.to_string(), "1010101010");
auto v2 = BitVec<>::from_string("AA").value();
assert_eq(v2.to_string(), "10101010");
auto v3 = BitVec<>::from_string("1010'1010").value();
assert_eq(v3.to_string(), "10101010");
auto v4 = BitVec<>::from_string("0x1.8").value();
assert_eq(v4.to_string(), "001");
static std::optional< BitVec > from_string(std::string_view sv)
Factory method to construct a bit-vector from a string s, returning std::nullopt on failure.
Definition BitVec.h:402

◆ front()

bool gf2::BitStore< BitVec< usize > >::front ( ) const
inlineconstexprinherited

Returns true if the first bit element is set, false otherwise.

Note
In debug mode the method panics of the store is empty.

Example

auto v = BitVec<>::ones(10);
assert_eq(v.front(), true);
v.set_all(false);
assert_eq(v.front(), false);

◆ get()

bool gf2::BitStore< BitVec< usize > >::get ( usize i) const
inlineconstexprinherited

Returns true if the bit at the given index i is set, false otherwise.

Note
In debug mode the index i is bounds-checked.

Example

BitVec v{10};
assert_eq(v.get(0), false);
v.set(0);
assert_eq(v.get(0), true);
constexpr bool get(usize i) const
Returns true if the bit at the given index i is set, false otherwise.
Definition BitStore.h:123

◆ is_empty()

bool gf2::BitStore< BitVec< usize > >::is_empty ( ) const
inlineconstexprinherited

Returns true if the store is empty, false otherwise.

Example

assert_eq(v.is_empty(), true);
BitVec u{10};
assert_eq(u.is_empty(), false);
constexpr bool is_empty() const
Returns true if the store is empty, false otherwise.
Definition BitStore.h:295

◆ last_set()

std::optional< usize > gf2::BitStore< BitVec< usize > >::last_set ( ) const
inlineinherited

Returns the index of the last set bit in the bit-store or {} if no bits are set.

Example

auto v = BitVec<u8>::zeros(37);
assert(v.last_set() == std::optional<usize>{});
v.set(2);
assert(v.last_set() == std::optional<usize>{2});
v.set(27);
assert(v.last_set() == std::optional<usize>{27});
BitVec empty;
assert(empty.last_set() == std::optional<usize>{});
std::optional< usize > last_set() const
Returns the index of the last set bit in the bit-store or {} if no bits are set.
Definition BitStore.h:706

◆ last_unset()

std::optional< usize > gf2::BitStore< BitVec< usize > >::last_unset ( ) const
inlineinherited

Returns the index of the last unset bit in the bit-store or {} if no bits are unset.

Example

auto v = BitVec<u8>::ones(37);
assert(v.last_unset() == std::optional<usize>{});
v.set(2, false);
assert(v.last_unset() == std::optional<usize>{2});
v.set(2);
assert(v.last_unset() == std::optional<usize>{});
v.set(27, false);
assert(v.last_unset() == std::optional<usize>{27});
BitVec empty;
assert(empty.last_unset() == std::optional<usize>{});
std::optional< usize > last_unset() const
Returns the index of the last unset bit in the bit-store or {} if no bits are unset.
Definition BitStore.h:832

◆ leading_zeros()

usize gf2::BitStore< BitVec< usize > >::leading_zeros ( ) const
inlineconstexprinherited

Returns the number of leading zeros in the store.

Example

BitVec v{37};
assert_eq(v.leading_zeros(), 37);
v.set(27);
assert_eq(v.leading_zeros(), 27);
auto w = BitVec<u8>::ones(10);
assert_eq(w.leading_zeros(), 0);
constexpr usize leading_zeros() const
Returns the number of leading zeros in the store.
Definition BitStore.h:629

◆ next_set()

std::optional< usize > gf2::BitStore< BitVec< usize > >::next_set ( usize index) const
inlineinherited

Returns the index of the next set bit after index in the store or {} if no more set bits exist.

Example

auto v = BitVec<u8>::zeros(37);
assert(v.next_set(0) == std::optional<usize>{});
v.set(2);
v.set(27);
assert(v.next_set(0) == std::optional<usize>{2});
assert(v.next_set(2) == std::optional<usize>{27});
assert(v.next_set(27) == std::optional<usize>{});

◆ next_unset()

std::optional< usize > gf2::BitStore< BitVec< usize > >::next_unset ( usize index) const
inlineinherited

Returns the index of the next unset bit after index in the store or {} if no more unset bits exist.

Example

auto v = BitVec<u8>::ones(37);
assert(v.next_unset(0) == std::optional<usize>{});
v.set(2, false);
v.set(27, false);
assert(v.next_unset(0) == std::optional<usize>{2});
assert(v.next_unset(2) == std::optional<usize>{27});
assert(v.next_unset(27) == std::optional<usize>{});
BitVec empty;
assert(empty.next_unset(0) == std::optional<usize>{});
std::optional< usize > next_unset(usize index) const
Returns the index of the next unset bit after index in the store or {} if no more unset bits exist.
Definition BitStore.h:860

◆ none()

bool gf2::BitStore< BitVec< usize > >::none ( ) const
inlineconstexprinherited

Returns true if no bits in the store are set, false otherwise.

Note
Empty store have no set bits (logical connective for none is AND with identity true).

Example

BitVec v{10};
assert_eq(v.none(), true);
v.set(0);
assert_eq(v.none(), false);
constexpr bool none() const
Returns true if no bits in the store are set, false otherwise.
Definition BitStore.h:355

◆ offset()

template<unsigned_word Word = usize>
u8 gf2::BitVec< Word >::offset ( ) const
inlineconstexpr

Returns the offset (in bits) of the first bit in the store within the first word.

This is always zero for BitVec.

◆ ones()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::ones ( usize n)
inlinestaticconstexpr

Factory method to generate a bit-vector of length n where the elements are all 1.

Example

assert_eq(BitVec<>::ones(10).to_string(), "1111111111");

◆ operator&()

auto gf2::BitStore< BitVec< usize > >::operator& ( const BitStore< Rhs > & rhs) const
inlineinherited

Returns a new bit-vector that is the AND of the current bit-store and another equal-sized bit-store.

Note
In debug mode, this method panics if the lengths of the two bit-stores do not match.

Example

auto v2 = ~v1;
auto v3 = v1 & v2;
assert_eq(v3.to_string(), "0000000000");

◆ operator&=()

void gf2::BitStore< BitVec< usize > >::operator&= ( const BitStore< Rhs > & rhs)
inlineinherited

In-place AND with another equal-sized bit-store.

Note
In debug mode, this method panics if the lengths of the two bit-stores do not match.

Example

v1 &= ~v1;
assert_eq(v1.to_string(), "0000000000");

◆ operator+()

auto gf2::BitStore< BitVec< usize > >::operator+ ( const BitStore< Rhs > & rhs) const
inlineinherited

Returns a new bit-vector that is the + of this store with the passed (equal-sized) rhs bit-store.

In GF(2) subtraction is the same as XOR.

Note
In debug mode, this methods panics if the lengths of lhs and rhs do not match.

Example

auto v2 = ~v1;
auto v3 = v1 + v2;
assert_eq(v3.to_string(), "1111111111");

◆ operator+=()

void gf2::BitStore< BitVec< usize > >::operator+= ( const BitStore< Rhs > & rhs)
inlineinherited

In-place addition of this bit-store with the an equal-sized rhs bit-store.

In GF(2) addition is the same as XOR.

Note
In debug mode, this methods panics if the lengths of lhs and rhs do not match.

Example

v1 += ~v1;
assert_eq(v1.to_string(), "1111111111");

◆ operator-()

auto gf2::BitStore< BitVec< usize > >::operator- ( const BitStore< Rhs > & rhs) const
inlineinherited

Returns a new bit-vector that is the - of this store with the passed (equal-sized) rhs bit-store.

In GF(2) subtraction is the same as XOR.

Note
In debug mode, this methods panics if the lengths of lhs and rhs do not match.

Example

auto v2 = ~v1;
auto v3 = v1 - v2;
assert_eq(v3.to_string(), "1111111111");

◆ operator-=()

void gf2::BitStore< BitVec< usize > >::operator-= ( const BitStore< Rhs > & rhs)
inlineinherited

In-place subtraction of this bit-store with the an equal-sized rhs bit-store.

In GF(2) subtraction is the same as XOR.

Note
In debug mode, this methods panics if the lengths of lhs and rhs do not match.

Example

v1 -= ~v1;
assert_eq(v1.to_string(), "1111111111");

◆ operator<<()

auto gf2::BitStore< BitVec< usize > >::operator<< ( usize shift) const
inlineconstexprinherited

Returns a new bit-vector that is lhs shifted left by shift bits.

Shifting is in vector-order so if v = [v0,v1,v2,v3] then v << 1 is [v1,v2,v3,0] with zeros added to the right. Left shifting in vector-order is the same as right shifting in bit-order.

Note
Only accessible bits are affected by the shift.

Example

auto v = BitVec<u8>::ones(20);
auto w = v << 8;
assert_eq(w.to_string(), "11111111111100000000");

◆ operator<<=()

void gf2::BitStore< BitVec< usize > >::operator<<= ( usize shift)
inlineconstexprinherited

In-place left shift of the bit-store by shift bits.

Shifting is in vector-order so if v = [v0,v1,v2,v3] then v <<= 1 is [v1,v2,v3,0] with zeros added to the right. Left shifting in vector-order is the same as right shifting in bit-order.

Note
Only accessible bits are affected by the shift.

Example

auto v = BitVec<u8>::ones(20);
v <<= 8;
assert_eq(v.to_string(), "11111111111100000000");

◆ operator>>()

auto gf2::BitStore< BitVec< usize > >::operator>> ( usize shift) const
inlineconstexprinherited

Returns a new bit-vector that is lhs shifted right by shift bits.

Shifting is in vector-order so if v = [v0,v1,v2,v3] then v >>= 1 is [0,v0,v1,v2] with zeros added to the left. Right shifting in vector-order is the same as left shifting in bit-order.

Note
Only accessible bits are affected by the shift.

Example

auto v = BitVec<u8>::ones(20);
auto w = v >> 8;
assert_eq(w.to_string(), "00000000111111111111");

◆ operator>>=()

void gf2::BitStore< BitVec< usize > >::operator>>= ( usize shift)
inlineconstexprinherited

In-place right shift of the bit-store by shift bits.

Shifting is in vector-order so if v = [v0,v1,v2,v3] then v >>= 1 is [0,v0,v1,v2] with zeros added to the left. Right shifting in vector-order is the same as left shifting in bit-order.

Note
Only accessible bits are affected by the shift.

Example

auto v = BitVec<u8>::ones(20);
v >>= 8;
assert_eq(v.to_string(), "00000000111111111111");

◆ operator[]()

bool gf2::BitStore< BitVec< usize > >::operator[] ( usize index) const
inlineconstexprinherited

Returns the boolean value of the bit element at index.

Note
In debug mode the index is bounds-checked.

Example

BitVec v{10};
assert(v[2] == false);
v[2] = true;
assert(v[2] == true);
assert(v.to_string() == "0010000000");

◆ operator^()

auto gf2::BitStore< BitVec< usize > >::operator^ ( const BitStore< Rhs > & rhs) const
inlineinherited

Returns a new bit-vector that is the XOR of the current bit-store and another equal-sized bit-store.

Note
In debug mode, this method panics if the lengths of the two bit-stores do not match.

Example

auto v2 = ~v1;
auto v3 = v1 ^ v2;
assert_eq(v3.to_string(), "1111111111");

◆ operator^=()

void gf2::BitStore< BitVec< usize > >::operator^= ( const BitStore< Rhs > & rhs)
inlineinherited

In-place XOR with another equal-sized bit-store.

Note
In debug mode, this method panics if the lengths of the two bit-stores do not match.

Example

v1 ^= ~v1;
assert_eq(v1.to_string(), "1111111111");

◆ operator|()

auto gf2::BitStore< BitVec< usize > >::operator| ( const BitStore< Rhs > & rhs) const
inlineinherited

Returns a new bit-vector that is the OR of the current bit-store and another equal-sized bit-store.

Note
In debug mode, this methods panics if the lengths of lhs and rhs do not match.

Example

auto v2 = ~v1;
auto v3 = v1 | v2;
assert_eq(v3.to_string(), "1111111111");

◆ operator|=()

void gf2::BitStore< BitVec< usize > >::operator|= ( const BitStore< Rhs > & rhs)
inlineinherited

In-place OR with another equal-sized bit-store.

Note
In debug mode, this method panics if the lengths of the two bit-stores do not match.

Example

v1 |= ~v1;
assert_eq(v1.to_string(), "1111111111");

◆ operator~()

auto gf2::BitStore< BitVec< usize > >::operator~ ( ) const
inlineinherited

Returns a new bit-vector that has the same bits as the current bit-store but with all the bits flipped.

Example

assert_eq(v.to_string(), "1010101010");
auto w = ~v;
assert_eq(w.to_string(), "0101010101");

◆ pop()

template<unsigned_word Word = usize>
std::optional< bool > gf2::BitVec< Word >::pop ( )
inlineconstexpr

Removes the last bit from the bit-vector and returns it or std::nullopt if the bit-vector is empty.

Example

v.push(1);
v.push(0);
assert(v.to_string() == "10");
auto b1 = v.pop();
assert_eq(*b1, false);
assert(v.to_string() == "1");
auto b2 = v.pop();
assert_eq(*b2, true);
assert(v.to_string() == "");
auto b3 = v.pop();
assert(b3 == std::nullopt);
constexpr BitVec & push(bool b)
Pushes a single bit b onto the bit-vector.
Definition BitVec.h:613
constexpr std::optional< bool > pop()
Removes the last bit from the bit-vector and returns it or std::nullopt if the bit-vector is empty.
Definition BitVec.h:767

◆ previous_set()

std::optional< usize > gf2::BitStore< BitVec< usize > >::previous_set ( usize index) const
inlineinherited

Returns the index of the previous set bit before index in the store or {} if there are none.

Example

auto v = BitVec<u8>::zeros(37);
assert(v.previous_set(36) == std::optional<usize>{});
v.set(2);
v.set(27);
assert(v.previous_set(36) == std::optional<usize>{27});
assert(v.previous_set(27) == std::optional<usize>{2});
assert(v.previous_set(2) == std::optional<usize>{});

◆ previous_unset()

std::optional< usize > gf2::BitStore< BitVec< usize > >::previous_unset ( usize index) const
inlineinherited

Returns the index of the previous unset bit before index in the store or {} if no more unset bits exist.

Example

auto v = BitVec<u8>::ones(37);
assert(v.previous_unset(0) == std::optional<usize>{});
v.set(2, false);
v.set(27, false);
assert(v.previous_unset(36) == std::optional<usize>{27});
assert(v.previous_unset(27) == std::optional<usize>{2});
assert(v.previous_unset(2) == std::optional<usize>{});
BitVec empty;
assert(empty.previous_unset(0) == std::optional<usize>{});
std::optional< usize > previous_unset(usize index) const
Returns the index of the previous unset bit before index in the store or {} if no more unset bits exi...
Definition BitStore.h:901

◆ push()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::push ( bool b)
inlineconstexpr

Pushes a single bit b onto the bit-vector.

Returns a reference to the current object for chaining.

Example

v.push(1);
assert(v.to_string() == "1");
v.push(0);
assert(v.to_string() == "10");

◆ random()

template<unsigned_word Word = usize>
BitVec gf2::BitVec< Word >::random ( usize len,
double p = 0.5,
u64 seed = 0 )
inlinestatic

Factory method to generate a bit-vector of size len where the elements are picked at random.

The default call BitVec<>::random(len) produces a random bit-vector with each bit being 1 with probability 0.5 and where the RNG is seeded from entropy.

Parameters
lenThe length of the bit-vector to generate.
pThe probability of the elements being 1 (defaults to a fair coin, i.e. 50-50).
seedThe seed to use for the random number generator (defaults to 0, which means use entropy).
Note
If p < 0 then the bit-vector is all zeros, if p > 1 then the bit-vector is all ones.

Example

u64 seed = 1234567890;
auto u = BitVec<>::random(10, 0.5, seed);
auto v = BitVec<>::random(10, 0.5, seed);
assert(u == v);
static BitVec random(usize len, double p=0.5, u64 seed=0)
Factory method to generate a bit-vector of size len where the elements are picked at random.
Definition BitVec.h:339
std::uint64_t u64
Word type alias for a 64-bit unsigned integer.
Definition unsigned_word.h:38

◆ random_fill()

auto gf2::BitStore< BitVec< usize > >::random_fill ( double p = 0.5,
u64 seed = 0 )
inlineinherited

Fill the store with random bits and returns a reference to this for chaining.

The default call random_fill() sets each bit to 1 with probability 0.5 (fair coin).

Parameters
pThe probability of the elements being 1 (defaults to a fair coin, i.e. 50-50).
seedThe seed to use for the random number generator (defaults to 0, which means use entropy).
Note
If p < 0 then the fill is all zeros, if p > 1 then the fill is all ones.

Example

BitVec u{10}, v{10};
u64 seed = 1234567890;
u.random_fill(0.5, seed);
v.random_fill(0.5, seed);
assert(u == v);
auto random_fill(double p=0.5, u64 seed=0)
Fill the store with random bits and returns a reference to this for chaining.
Definition BitStore.h:560

◆ resize()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::resize ( usize n)
inlineconstexpr

Resize the bit-vector so that its size() is n.

  • If n is greater than the bit-vector's current size, then the new elements are set to 0.
  • If n is less than the bit-vector's current size, then the bit-vector is truncated.

Example

auto v = BitVec<u8>::ones(1000);
v.resize(10);
assert_eq(v.to_string(), "1111111111");
v.resize(15);
assert_eq(v.to_string(), "111111111100000");

◆ riffle_into()

void gf2::BitStore< BitVec< usize > >::riffle_into ( BitVec< word_type > & dst) const
inlineconstexprinherited

Interleaves the bits of this bit-store with zeros storing the result into the bit-vector dst.

On return, dst will have the bits of this bit-store interleaved with zeros. For example, if this bit-store has the bits abcde then dst will have the bits a0b0c0d0e.

Note
There is no last zero bit in dst.

Example

auto v = BitVec<u8>::ones(10);
v.riffle_into(dst);
assert_eq(dst.to_string(), "1010101010101010101");

◆ riffled()

auto gf2::BitStore< BitVec< usize > >::riffled ( ) const
inlineconstexprinherited

Returns a new bit-vector that is the result of riffling the bits in this bit-store with zeros.

If bit-store has the bits abcde then the output bit-vector will have the bits a0b0c0d0e.

Note
There is no last zero bit in dst.

Example

auto v = BitVec<u8>::ones(10);
auto dst = v.riffled();
assert_eq(dst.to_string(), "1010101010101010101");

◆ seeded_random()

template<unsigned_word Word = usize>
BitVec gf2::BitVec< Word >::seeded_random ( usize len,
u64 seed )
inlinestatic

Factory method to generate a bit-vector of size len where the elements are from independent fair coin flips generated from an RNG seeded with the given seed.

This allows one to have reproducible random bit-vectors, which is useful for testing and debugging.

Parameters
lenThe length of the bit-vector to generate.
seedThe seed to use for the random number generator (if you set this to 0 then entropy is used).
Note
If p < 0 then the bit-vector is all zeros, if p > 1 then the bit-vector is all ones.

Example

u64 seed = 1234567890;
auto u = BitVec<>::seeded_random(10, seed);
auto v = BitVec<>::seeded_random(10, seed);
assert(u == v);
static BitVec seeded_random(usize len, u64 seed)
Factory method to generate a bit-vector of size len where the elements are from independent fair coin...
Definition BitVec.h:362

◆ set()

auto gf2::BitStore< BitVec< usize > >::set ( usize index,
bool value = true )
inlineinherited

Sets the bit-element at the given index to the specified boolean value & returns this for chaining. The default value for value is true.

Note
In debug mode the index is bounds-checked.

Example

BitVec v{10};
assert_eq(v.get(0), false);
v.set(0);
assert_eq(v.get(0), true);

◆ set_all()

auto gf2::BitStore< BitVec< usize > >::set_all ( bool value = true)
inlineinherited

Sets the bits in the store to the boolean value and returns a reference to this for chaining.

By default, all bits are set to true.

Example

auto v = BitVec<u8>::zeros(10);
v.set_all();
assert_eq(v.to_string(), "1111111111");

◆ set_bit_indices()

auto gf2::BitStore< BitVec< usize > >::set_bit_indices ( ) const
inlineconstexprinherited

Returns an iterator over the indices of any set bits in the bit-store.

You can use this iterator to iterate over the set bits in the store and get the index of each bit.

Example

assert_eq(v.to_string(), "1010101010");
auto indices = std::ranges::to<std::vector>(v.set_bit_indices());
assert_eq(indices, (std::vector<usize>{0, 2, 4, 6, 8}));

◆ set_word() [1/2]

void gf2::BitStore< BitVec< usize > >::set_word ( usize i,
word_type value )
inlineconstexprinherited

This method sets "word" at index i to the specified value.

For example, if the store has 18 bit elements, then setting the first word changes bit elements 0 through 7, the second word changes bit elements 8 through 15, and the third word changes bit elements 16 and 17.

This method is trivially implemented by the BitVec class. However, the bits in a BitSpan may not be aligned to word boundaries but that class synthesises words as if they were by combining adjacent words as needed.

Note
The method must ensure that inaccessible bits in the underlying store are not changed by this call.

◆ set_word() [2/2]

template<unsigned_word Word = usize>
void gf2::BitVec< Word >::set_word ( usize i,
Word word )
inlineconstexpr

Sets word i in the bit-vector's underlying word store to value (masked if necessary).

The final word in the store may not be fully occupied but we ensure that unused bits remain set to 0.

Note
In debug mode the index is bounds checked.

Example

auto v = BitVec<u8>::zeros(10);
assert_eq(v.to_string(), "0000000000");
v.set_word(1, 0b1111'1111);
assert_eq(v.to_string(), "0000000011");
assert_eq(v.count_ones(), 2);

◆ shrink_to_fit()

template<unsigned_word Word = usize>
BitVec & gf2::BitVec< Word >::shrink_to_fit ( )
inlineconstexpr

Shrinks the bit-vector's capacity as much as possible.

This method may do nothing.

Example

auto v = BitVec<u8>::ones(1000);
v.resize(15);
v.shrink_to_fit();
assert_eq(v.capacity(), 16);

◆ size()

template<unsigned_word Word = usize>
usize gf2::BitVec< Word >::size ( ) const
inlineconstexpr

Returns the number of bit-elements in the bit-vector.

Example

BitVec v0;
assert_eq(v0.size(), 0);
BitVec<u8> v1(10);
assert_eq(v1.size(), 10);

◆ span()

auto gf2::BitStore< BitVec< usize > >::span ( usize begin,
usize end ) const
inlineconstexprinherited

Returns an immutable bit-span encompassing the bits in the half-open range [begin, end).

Immutability here is deep – the interior pointer in the returned span is to const words.

Note
This method panics if the bit-store is empty or if the range is not valid.

Example

auto v = BitVec<>::alternating(10);
auto s = v.span(1,5);
assert_eq(s.to_string(), "0101");

◆ split_at()

void gf2::BitStore< BitVec< usize > >::split_at ( usize at,
BitVec< word_type > & left,
BitVec< word_type > & right ) const
inlineconstexprinherited

Views a bit-store as two parts containing the elements [0, at) and [at, size()) respectively.

Clones of the parts are stored in the passed bit-vectors left and right.

On return, left contains the bits from the start of the bit-vector up to but not including at and right contains the bits from at to the end of the bit-vector. This bit-vector itself is not modified.

This lets one reuse the left and right destinations without having to allocate new bit-vectors. This is useful when implementing iterative algorithms that need to split a bit-vector into two parts repeatedly.

Note
This method panics if the split point is beyond the end of the bit-vector.

Example

auto v = BitVec<>::alternating(10);
BitVec left, right;
v.split_at(5, left, right);
assert_eq(left.to_string(), "10101");
assert_eq(right.to_string(), "01010");
assert_eq(v.to_string(), "1010101010");

◆ split_off() [1/2]

template<unsigned_word Word = usize>
BitVec< Word > gf2::BitVec< Word >::split_off ( usize at)
inlineconstexpr

Splits a bit-vector into two at the given index, returning a new BitVec.

The returned bit-vector contains the bits from at to the end of the bit-vector. The bit-vector is resized to only contain the bits in the half-open range [0, at).

Note
This method panics if the split point is beyond the end of the bit-vector.

Example

auto v = BitVec<>::alternating(10);
auto w = v.split_off(5);
assert_eq(v.to_string(), "10101");
assert_eq(w.to_string(), "01010");

◆ split_off() [2/2]

template<unsigned_word Word = usize>
void gf2::BitVec< Word >::split_off ( usize at,
BitVec< Word > & dst )
inlineconstexpr

Splits a bit-vector into two at the given index, returning the second part in dst.

On return, dst contains the bits from at to the end of the bit-vector. The bit-vector is resized to only contain the bits in the half-open range [0, at).

Note
This method panics if the split point is beyond the end of the bit-vector.

Example

auto v = BitVec<>::alternating(10);
BitVec dst;
v.split_off(5, dst);
assert_eq(v.to_string(), "10101");
assert_eq(dst.to_string(), "01010");

◆ split_off_unsigned()

template<unsigned_word Word = usize>
template<unsigned_word Dst = Word>
std::optional< Dst > gf2::BitVec< Word >::split_off_unsigned ( )
inlineconstexpr

Split off a single arbitrary sized unsigned integer off the end of the bit-vector and returns it or std::nullopt if the bit-vector is empty.

Note
You can split off a primitive unsigned integer type of any size from the end of a non-empty bit-vector.

For example, if v is a BitVec<u8>with 22 elements, then you can split off a u16 value from the end of v by calling v.split_off_unsigned<u16>(). This leaves the bit-vector with 6 elements.

Examples

auto v = BitVec<u8>::ones(22);
auto x16 = v.split_off_unsigned<u16>();
assert_eq(*x16, 0b1111'1111'1111'1111);
assert_eq(v.size(), 6);
assert_eq(v.to_string(), "111111");
auto x8 = w.split_off_unsigned<u8>();
assert_eq(*x8, 0b0101'0101);
assert_eq(w.size(), 16);
assert_eq(w.to_string(), "1010101010101010");
w.append(*x8);
assert_eq(w.to_string(), "101010101010101010101010");

◆ store_words()

auto gf2::BitStore< BitVec< usize > >::store_words ( ) const
inlineconstexprinherited

Returns a const iterator over all the words underlying the bit-store.

You can use this iterator to iterate over the words in the store and read the Word value of each word. Note that you cannot use this iterator to modify the words in the store.

Note
The words here may be a synthetic construct. The expectation is that the bit 0 in the store is located at the bit-location 0 of word(0). That is always the case for bit-vectors but bit-slices typically synthesise "words" on the fly from adjacent pairs of bit-vector words. Nevertheless, almost all the methods in BitStore are implemented efficiently by operating on those words.

Example

auto v = BitVec<u8>::ones(10);
assert_eq(v.to_string(), "1111111111");
auto indices = std::ranges::to<std::vector>(v.store_words());
assert_eq(indices, (std::vector<u8>{0b1111'1111, 0b0000'0011}));

◆ sub()

auto gf2::BitStore< BitVec< usize > >::sub ( usize begin,
usize end ) const
inlineconstexprinherited

Returns a clone of the elements in the half-open range [begin, end) as a new bit-vector.

Note
This method panics if the bit-vector is empty or if the range is not valid.

Example

auto v = BitVec<>::alternating(10);
auto s = v.sub(1,5);
assert_eq(s.to_string(), "0101");
s.set_all();
assert_eq(s.to_string(), "1111");
assert_eq(v.to_string(), "1010101010");

◆ swap()

auto gf2::BitStore< BitVec< usize > >::swap ( usize i0,
usize i1 )
inlineconstexprinherited

Swaps the bits in the bit-store at indices i0 and i1 and returns this for chaining.

Note
In debug mode, panics if either of the indices is out of bounds.

Example

auto v = BitVec<>::zeros(10);
v.set(0);
assert_eq(v.to_string(), "1000000000");
v.swap(0, 1);
assert_eq(v.to_string(), "0100000000");
v.swap(0, 1);
assert_eq(v.to_string(), "1000000000");
v.swap(0, 9);
assert_eq(v.to_string(), "0000000001");
v.swap(0, 9);
assert_eq(v.to_string(), "1000000000");

◆ to_binary_string()

std::string gf2::BitStore< BitVec< usize > >::to_binary_string ( std::string_view sep = "",
std::string_view pre = "",
std::string_view post = "" ) const
inlineinherited

Returns a binary string representation of the store.

The string is formatted as a sequence of 0s and 1s with the least significant bit on the right.

Parameters
sepThe separator between bit elements which defaults to no separator.
preThe prefix to add to the string which defaults to no prefix.
postThe postfix to add to the string which defaults to no postfix.

Example

BitVec v{10};
assert_eq(v.to_binary_string(), "0000000000");
v.set(0);
assert_eq(v.to_binary_string(), "1000000000");
assert_eq(v.to_binary_string(",", "[", "]"), "[1,0,0,0,0,0,0,0,0,0]");
std::string to_binary_string(std::string_view sep="", std::string_view pre="", std::string_view post="") const
Returns a binary string representation of the store.
Definition BitStore.h:1641

◆ to_hex_string()

std::string gf2::BitStore< BitVec< usize > >::to_hex_string ( ) const
inlineinherited

Returns the "hex" string representation of the bits in the bit-store.

The output is a string of hex characters without any spaces, commas, or other formatting.

The string may have a two character suffix of the form ".base" where base is one of 2, 4 or 8.
All hex characters encode 4 bits: "0X0" -> 0b0000, "0X1" -> 0b0001, ..., "0XF" -> 0b1111.
The three possible ".base" suffixes allow for bit-vectors whose length is not a multiple of 4.
Empty bit-vectors are represented as the empty string.

  • 0X1 is the hex representation of the bit-vector 0001 => length 4.
  • 0X1.8 is the hex representation of the bit-vector 001 => length 3.
  • 0X1.4 is the hex representation of the bit-vector 01 => length 2.
  • 0X1.2 is the hex representation of the bit-vector 1 => length 1.

The output is in vector-order. If "h0" is the first hex digit in the output string, you can print it as four binary digits v_0v_1v_2v_3. For example, if h0 = "A" which is 1010 in binary, then v = 1010.

Example

BitVec v0;
assert_eq(v0.to_hex_string(), "");
auto v1 = BitVec<>::ones(4);
assert_eq(v1.to_hex_string(), "F");
auto v2 = BitVec<>::ones(5);
assert_eq(v2.to_hex_string(), "F1.2");
auto v3 = BitVec<>::alternating(8);
assert_eq(v3.to_binary_string(), "10101010");
assert_eq(v3.to_hex_string(), "AA");
std::string to_hex_string() const
Returns the "hex" string representation of the bits in the bit-store.
Definition BitStore.h:1704

◆ to_pretty_string()

std::string gf2::BitStore< BitVec< usize > >::to_pretty_string ( ) const
inlineinherited

Returns a "pretty" string representation of the store.

The output is a string of 0's and 1's with spaces between each bit, and the whole thing enclosed in square brackets.

Example

auto v = BitVec<>::alternating(10);
assert_eq(v.to_pretty_string(), "[1,0,1,0,1,0,1,0,1,0]");
BitVec empty;
assert_eq(empty.to_pretty_string(), "[]");
std::string to_pretty_string() const
Returns a "pretty" string representation of the store.
Definition BitStore.h:1623

◆ to_string()

std::string gf2::BitStore< BitVec< usize > >::to_string ( std::string_view sep = "",
std::string_view pre = "",
std::string_view post = "" ) const
inlineinherited

Returns a binary string representation of the store.

The string is formatted as a sequence of 0s and 1s with the least significant bit on the right.

Parameters
sepThe separator between bit elements which defaults to no separator.
preThe prefix to add to the string which defaults to no prefix.
postThe postfix to add to the string which defaults to no postfix.

Example

BitVec v{10};
assert_eq(v.to_string(), "0000000000");
v.set(0);
assert_eq(v.to_string(), "1000000000");
assert_eq(v.to_string(",", "[", "]"), "[1,0,0,0,0,0,0,0,0,0]");

◆ to_words()

auto gf2::BitStore< BitVec< usize > >::to_words ( ) const
inlineconstexprinherited

Returns a copy of the words underlying this bit-store.

Note
The last word in the vector may not be fully occupied but unused slots will be all zeros.

Example

auto v = BitVec<u8>::ones(10);
auto words = v.to_words();
assert_eq(words, (std::vector<u8>{0b1111'1111, 0b0000'0011}));
constexpr usize words() const
Returns the number of words in the bit-vector's underlying word store.
Definition BitVec.h:77

◆ trailing_zeros()

usize gf2::BitStore< BitVec< usize > >::trailing_zeros ( ) const
inlineconstexprinherited

Returns the number of trailing zeros in the store.

Example

auto v = BitVec<u8>::zeros(27);
assert_eq(v.trailing_zeros(), 27);
v.set(0);
assert_eq(v.trailing_zeros(), 26);

◆ unit()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::unit ( usize n,
usize i )
inlinestaticconstexpr

Factory method to generate a "unit" bit-vector of length n where only element i is set.

This method panics if the condition i < n is not met.

Example

assert_eq(BitVec<>::unit(10, 0).to_string(), "1000000000");
assert_eq(BitVec<>::unit(10, 9).to_string(), "0000000001");
static constexpr BitVec unit(usize n, usize i)
Factory method to generate a "unit" bit-vector of length n where only element i is set.
Definition BitVec.h:242

◆ unset_bit_indices()

auto gf2::BitStore< BitVec< usize > >::unset_bit_indices ( ) const
inlineconstexprinherited

Returns an iterator over the indices of any unset bits in the bit-store.

You can use this iterator to iterate over the unset bits in the store and get the index of each bit.

Example

assert_eq(v.to_string(), "1010101010");
auto indices = std::ranges::to<std::vector>(v.unset_bit_indices());
assert_eq(indices, (std::vector<usize>{1, 3, 5, 7, 9}));

◆ with_capacity()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::with_capacity ( usize capacity)
inlinestaticconstexpr

Factory method to construct an empty bit-vector with at least the specified capacity.

Example

assert_eq(v.size(), 0);
assert(v.capacity() >=10);
static constexpr BitVec with_capacity(usize capacity)
Factory method to construct an empty bit-vector with at least the specified capacity.
Definition BitVec.h:199

◆ word()

template<unsigned_word Word = usize>
Word gf2::BitVec< Word >::word ( usize i) const
inlineconstexpr

Returns word i from the bit-vector's underlying word store.

The final word in the store may not be fully occupied but we guarantee that unused bits are set to 0.

Note
In debug mode the index is bounds checked.

Example

auto v = BitVec<u8>::ones(10);
assert_eq(v.to_string(), "1111111111");
assert_eq(v.words(), 2);
assert_eq(v.word(0), 0b1111'1111);
assert_eq(v.word(1), 0b0000'0011);

◆ words()

template<unsigned_word Word = usize>
usize gf2::BitVec< Word >::words ( ) const
inlineconstexpr

Returns the number of words in the bit-vector's underlying word store.

The bit-elements are packed into a standard vector with this number of words.

Example

BitVec v0;
assert_eq(v0.words(), 0);
BitVec<u8> v1(10);
assert_eq(v1.words(), 2);

◆ zeros()

template<unsigned_word Word = usize>
constexpr BitVec gf2::BitVec< Word >::zeros ( usize n)
inlinestaticconstexpr

Factory method to generate a bit-vector of length n where the elements are all 0.

Example

auto v = BitVec<>::zeros(10);
assert_eq(v.to_string(), "0000000000");