--- title: "bitset" --- {{< callout >}} Header: `bitset.h` Since: 20.33.0 Similar to: [std::bitset](https://en.cppreference.com/w/cpp/utility/bitset.html) {{< /callout >}} This is the new default bitset implementation, from 20.33.0 onwards. For the older version, see [etl::bitset (legacy)](). A fixed capacity bitset. Has a number of extensions over `std::bitset`. Can be considered similar to an array of `bool`. Internally defined buffers ```cpp etl::bitset etl::bitset ``` Externally defined buffers from `20.34.0` ```cpp etl::bitset_ext etl::bitset_ext ``` The template parameters will determine whether the bitset uses a common implementation or one of four fixed sized implementations. Note: `etl::ibitset` is no longer a reference type for any size `etl::bitset`. --- `etl::bitset` and `etl::bitset_ext` on their own will use `unsigned char` as the underlying element type and the operations will be implemented by the generic protected member functions in `etl::ibitset`. --- ```cpp etl::bitset ``` ```cpp etl::bitset_ext ``` Specifying a type for `TElement` will override the default element type and define it as the *unsigned* type of `TElement`. **Specialisations for maximum efficiency** There are specialisations for when the required number of bits matches the number of bits in the element type. These specialisations are considerably faster and more efficient. ```cpp etl::bitset<8, uint8_t> etl::bitset<16, uint16_t> etl::bitset<32, uint32_t> etl::bitset<8, uint64_t> ``` `any()`, `none()` and `all()` are overloaded in these specialisations to allow a mask to be specified, so that a bitset that requires less bits than the element type may still use the most efficient implementation. ```cpp etl::bitset<8, uint8_t> bst; // But only want to use 6 bits. bool any = bst.any(0x3F); // Check the lower 6 bits. ``` ## Types | Type | | | - | - | |`span_type` | A mutable span type. | |`const_span_type`| A non-mutable span type. | |`element_type` | The type used as the internal storage for a bitset. By default, this is unsigned char. | |`buffer_type` | The type used as the to define the external buffer. Defined in `etl::bitset_ext` only. `20.34.0` | ## Constants All `npos` values are equivalent. ```cpp etl::bitset_constants::npos ``` ```cpp etl::bitset<>::npos ``` ```cpp template etl::bitset::npos ``` `Number_Of_Elements` `Bits_Per_Element` `Allocated_Bits` `All_Set_Element` `All_Clear_Element` From: 20.38.11 `Storage_Model` `etl::bitset_storage_model::Single` or `etl::bitset_storage_model::Multi` ## Constructors The initial state of the bitset is all clear (`false`). ```cpp etl::bitset(); etl::bitset(unsigned long value); etl::bitset(const char* str); etl::bitset(const wchar_t* str); etl::bitset(const char16_t* str); etl::bitset(const char32_t* str); ``` **Description** The bitset is either default constructed, initialised with a numeric value, or a text string of zeros and ones. --- ```cpp etl::bitset_ext(element_type* pbuffer); etl::bitset_ext(unsigned long value, element_type* pbuffer); etl::bitset_ext(const char* str, element_type* pbuffer); etl::bitset_ext(const wchar_t* str, element_type* pbuffer); etl::bitset_ext(const char16_t* str, element_type* pbuffer); etl::bitset_ext(const char32_t* str, element_type* pbuffer); ``` **Description** The bitset is either default constructed, initialised with a numeric value, or a text string of zeros and ones. A pointer to an external must be supplied that is large enough to hold the bitset. The buffer may be defined as follows:- ```cpp using Bitset = etl::bitset_ext<32>; Bitset::element_type buffer[Bitset::Number_Of_Elements]; ``` From: 20.34.0 --- ```cpp etl::bitset_ext(buffer_type& buffer); etl::bitset_ext(unsigned long value, buffer_type& buffer); etl::bitset_ext(const char* str, buffer_type& buffer); etl::bitset_ext(const wchar_t* str, buffer_type& buffer); etl::bitset_ext(const char16_t* str, buffer_type& buffer); etl::bitset_ext(const char32_t* str, buffer_type& buffer); ``` **Description** The bitset is either default constructed, initialised with a numeric value, or a text string of zeros and ones. An external buffer must be supplied that is large enough to hold the bitset. The buffer may be defined as follows:- ```cpp using Bitset = etl::bitset_ext<32>; Bitset::buffer_type buffer; ``` From: 20.34.0 ## Modifiers ```cpp etl::bitset& set(); ``` **Description** Set all bits. --- ```cpp etl::bitset& set(element_type value); ``` **Description** Set the bits to `value`. Valid when the bitset width matches the element type width. From: `20.34.0` --- ```cpp etl::bitset& set(const char* str); etl::bitset& set(const wchar_t* str); etl::bitset& set(const char16_t* str); etl::bitset& set(const char32_t* str); ``` **Description** Set with a text string of `0` and `1` characters. --- ```cpp etl::bitset& set(size_t position, bool value = true); ``` **Description** Set a position to a one or zero, default one. --- ```cpp etl::bitset& reset(); ``` **Description** Reset all bits. --- ```cpp etl::bitset& reset(size_t position); ``` **Description** Set a position to a zero. --- ```cpp etl::bitset& from_string(const char*); etl::bitset& from_string(const wchar_t*); etl::bitset& from_string(const char16_t*); etl::bitset& from_string(const char32_t*); ``` **Description** Alias of set. The bitset is built from a string of `0` and `1` characters. ## Access ```cpp template T value() const ``` **Description** Returns the value corresponding to the bitset. `T` specifies the integral type to convert to. --- ```cpp unsigned long to_ulong() const unsigned long long to_ullong() const ``` **Description** Functions for compatibility with the STL. Calls value() or value(). If the type is too small to contain the bitset size, a compile time error will result. --- ```cpp template TString to_string(typename TString::value_type zero = typename TString::value_type('0'), typename TString::value_type one = typename TString::value_type('1')) const ``` Returns the value as a string of `0` and `1` characters. If the string type is not large enough to contain the digits then an `etl::bitset_string_too_small` is emitted. --- ```cpp span_type span() const_span_type span() const ``` **Description** Returns an `etl::span` of the underlying binary data. The span is ordered LSB to MSB. --- ```cpp template ETL_CONSTEXPR14 T extract(size_t position, size_t length = etl::integral_limits::bits) const ``` **Description** Extract an integral value from an arbitrary position and length. Run time position and length. --- ```cpp template ::bits> ETL_CONSTEXPR14 T extract() const ``` **Description** Extract an integral value from an arbitrary position and length. Compile time position and length. From: 20.38.11 For C++11 and above --- ```cpp template T extract() const ``` **Description** Extract an integral value from an arbitrary position and length. Compile time position and length. From: `20.38.11` For C++98/03 ## Bit access ```cpp bool operator[](size_t position) const ``` **Description** Returns the boolean state of the indexed bit. position is not checked for validity. --- ```cpp size_t count() const ``` **Description** Returns the number of set bits. --- ```cpp size_t size() const ``` **Description** Returns the number of bits supported by this bitset. --- ```cpp bool test(size_t position) const ``` **Description** Returns the boolean state of the indexed bit. position is not checked for validity. --- ```cpp bool any() const ``` **Description** Returns true if any of the bits are set, otherwise false. ```cpp bool any(element_type mask) const ``` **Description** Only enabled for bitsets that fit within one element. Returns `true` if any of the bits are set, after the mask has been applied, otherwise `false`. Valid when the bitset width matches the element type width. From: `20.34.0` --- ```cpp bool none() const ``` **Description** Returns true if none of the bits are set, otherwise false. ```cpp bool none(element_type mask) const ``` **Description** Only enabled for bitsets that fit within one element. Returns `true` if none of the bits are set, after the mask has been applied, otherwise `false`. Valid when the bitset width matches the element type width. From: `20.34.0` --- ```cpp bool all() const ``` **Description** Returns `true` if al of the bits are set, otherwise `false`. ```cpp bool all(element_type mask) const ``` **Description** Only enabled for bitsets that fit within one element. Returns `true` if al of the bits are set, after the mask has been applied, otherwise `false`. Valid when the bitset width matches the element type width. From: `20.34.0` --- ```cpp size_t find_first(bool state) const ``` **Description** Returns the position of the first bit in the specified state. If not found then returns `bitset<>::npos`. --- ```cpp size_t find_next(bool state, size_t position) const ``` **Description** Returns the position of the next bit in the specified state, starting from position. If not found then returns `bitset<>::npos`. `position` is not checked for validity. ## Bit operations ```cpp bitset& operator &= (const bitset& rhs); bitset& operator |= (const bitset& rhs); bitset& operator ^= (const bitset& rhs); bitset& operator <<= (size_t shift); bitset& operator >>= (size_t shift); bool operator == (const bitset& rhs); bool operator != (const bitset& rhs); ``` ## Non-member functions ```cpp void swap(etl::bitset& lhs, etl::bitset& rhs) ``` **Description** Swaps the contents of the two bitsets. The bitsets must be the same size.