This is a header-only dynamic bitset developed in C++20, but probably works for other versions as well. This is also doesn't cause CUDA to freak out when included. This library has includes the most basic features a bitset needs: push_i
, pop_i
, set_i
, set
, unset_i
, unset
, toggle_i
, toggle
, swap
, reverse
, set_string
, get_string
, get_bit
, destroy
. More about all of those functions later. This library can defintetely be improved in terms of performance and memory useage, but the current version does a pretty good job, the amount of bytes that the data container takes up is calculated like this: floor(n_bits / 8)
, plus sizeof(bool)
and sizeof(int)
. The deconstructor of the bitset class deallocates all dynamically allocated memory, but if you wish, you can deallocate the memory before exit using destroy()
. This library also does basic error checking, but some stuff might bypass, so be careful and try to avoid giving it invalid data.
Caution
MD5 CHECKSUM: 95f7fc2e21d53363db9df3a4cbff2733 (i used https://md5file.com/calculator)
#include "dynamic_bitset.h" // include
#include <iostream>
int main() {
dynamic_bitset::dynamic_bitset bitset; // define and construct bitset
bitset.push_i(0, 1); // push bit 1 to index 0
bitset.push_i(1, 0); // push bit 0 to index 1
bitset.push_i(2, 1); // push bit 1 to index 2
bitset.push_i(3, 0); // push bit 0 to index 3
bitset.pop_i(0); // pop bit at index 0
bitset.pop_i(1); // pop bit at index 1
bitset.set_i(0); // give bit at index 0 value 1
bitset.set(); // give all bits value 1
bitset.unset_i(1); // give bit at index 1 value 0
bitset.unset(); // give all bits value 0
bitset.toggle_i(0); // toggle the value of bit at index 0
bitset.toggle(); // toggle the value of all bits
bitset.swap(0, 1); // swap the values of bits at index 0 and 1
bitset.reverse(); // reverse the bits in bitset
bitset.extend(5, 0); // extend the bitset with 5 bits which all have a default value 0
bitset.set_string("1101001"); // set the contents of bitset to 1101001
std::cout << bitset.get_string(); // get contents of bitset
std::cout << bitset.get_bit(0); // get value of bit and index 0
std::cout << "\n";
bitset.destroy(); // destroy bitset (frees up some memory, not necessary as the deconstrucor also does this)
return 0;
} // OUTPUT: 11010011
#pragma once
#include <string>
#include <exception>
namespace dynamic_bitset {
class dynamic_bitset {
public:
bool initialized = false; // if bitset is initialized
unsigned int size = 0; // amount of bits in bitset
char* bytes = nullptr; // contains the bits
void push_i(unsigned int index, bool bit); // push (insert) bit to index
void pop_i(unsigned int index); // pop (remove) bit at index
void set_i(unsigned int index); // set bit at index
void set(); // set all bits
void unset_i(unsigned int index); // unset bit at index
void unset(); // unset all bits
void toggle_i(unsigned int index); // toggle bit at index
void toggle(); // toggle all bits
void swap(unsigned int index_1, unsigned int index_2); // swap bits at index_1 and index_2
void reverse(); // reverse the order of bits in bitset
void extend(unsigned int amount, bool default_bit); // add bits with default value
void set_string(std::string input); // set the contents bitset using string, example "1101001"
std::string get_string(); // get the contents of the bitset in string format
bool get_bit(unsigned int index); // get the value of bit at index
dynamic_bitset(); // constructor
~dynamic_bitset(); // deconstructor
void destroy(); // deallocate the bit container and set bitset to uninitialized
}
}