C++ bitset and its application
A bitset is an array of bools but each boolean value is not stored in a separate byte instead, bitset optimizes the space such that each boolean value takes 1-bit space only, so space taken by bitset is less than that of an array of bool or vector of bool.
A limitation of the bitset is that size must be known at compile time i.e. size of the bitset is fixed.
std::bitset is the class template for bitset that is defined inside <bitset> header file so we need to include the header file before using bitset in our program.
Syntax:
bitset<size> variable_name(initialization);
We can initialize bitset in three ways :
1. Uninitialized: All the bits will be set to zero.
bitset<size> variable_name;
2. Initialization with decimal integer: Bitset will represent the given decimal number in binary form.
bitset<size> variable_name(DECIMAL_NUMBER);
3. Initialization with binary string: Bitset will represent the given binary string.
bitset<size> variable_name(string("BINARY_STRING"));
bitset<size> variable_name("BINARY_STRING");
Example:
C++
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
bitset<8> uninitializedBitset;
bitset<8> decimalBitset(15);
bitset<8> stringBitset(string( "1111" ));
cout << "Uninitialized bitset: " << uninitializedBitset
<< endl;
cout << "Initialized with decimal: " << decimalBitset
<< endl;
cout << "Initialized with string: " << stringBitset
<< endl;
return 0;
}
|
Output
Uninitialized bitset: 00000000
Initialized with decimal: 00001111
Initialized with string: 00001111
std::bitset Member Functions
std::bitset class contains some useful member functions to work on the bitset objects. Here is the list of some member functions of std::bitset:
set()
|
Set the bit value at the given index to 1. |
reset()
|
Set the bit value at a given index to 0. |
flip()
|
Flip the bit value at the given index. |
count()
|
Count the number of set bits. |
test()
|
Returns the boolean value at the given index. |
any()
|
Checks if any bit is set. |
none()
|
Checks if none bit is set. |
all()
|
Check if all bit is set. |
size()
|
Returns the size of the bitset. |
to_string()
|
Converts bitset to std::string. |
to_ulong()
|
Converts bitset to unsigned long. |
to_ullong()
|
Converts bitset to unsigned long long. |
Example:
C++
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
int index = 0;
bitset<4> allSet( "1111" ), allUnset;
cout << "any() value: " << boolalpha << allSet.any()
<< endl;
cout << "all() value: " << allSet.all() << endl;
cout << "none() value: " << allSet.none() << endl;
cout << "test() at index 0: " << noboolalpha
<< allSet.test(index) << endl;
cout << "size() value: " << allSet.size() << endl;
cout << "Value of allUnset on before using set(): "
<< allUnset << endl;
allUnset.set(index);
cout << "Value of allUnset on after using set(): "
<< allUnset << endl;
cout << "Value of allSet on before using reset(): "
<< allSet << endl;
allSet.reset(index);
cout << "Value of allSet on after using reset(): "
<< allSet << endl;
string bitString;
bitString = allSet.to_string();
cout << "bitString: " << bitString << endl;
cout << "Unsigned Long value: " << allSet.to_ulong();
return 0;
}
|
Output
any() value: true
all() value: true
none() value: false
test() at index 0: 1
size() value: 4
Value of allUnset on before using set(): 0000
Value of allUnset on after using set(): 0001
Value of allSet on before using reset(): 1111
Value of allSet on after using reset(): 1110
bitString: 1110
Unsigned Long value: 14
Note: boolalpha is used to print “true” and “false” instead of 1 or 0 for boolean values and noboolalpha for opposite.
std::bitset Operators
Some of the basic operators are overloaded to work with bitset objects. Following is the list of those operators:
[]
|
Access operator |
&
|
Bitwise AND |
|
|
Bitwise OR |
!
|
Bitwise XOR |
>>=
|
Binary Right shift and assign |
<<=
|
Binary Left shift and assign |
&=
|
Assign the value of bitwise AND to the first bitset. |
|=
|
Assign the value of bitwise OR to the first bitset. |
^=
|
Assign the value of bitwise XOR to the first bitset. |
~
|
Bitwise NOT |
Example:
C++
#include <bitset>
#include <iostream>
using namespace std;
int main()
{
bitset<4> bitset1( "1001" ), bitset2( "1010" );
bitset<4> result;
cout << "Bitset1: " << bitset1
<< "\nBitset2: " << bitset2 << endl;
cout << "Accessing bit value at index 1 of bitset1: "
<< bitset1[1] << endl;
cout << "Bitwise AND using &: "
<< (result = bitset1 & bitset2) << endl;
cout << "Bitwise AND using &=: " << (bitset1 &= bitset2)
<< endl;
bitset1 = 9;
cout << "Bitwise OR using |: "
<< (result = bitset1 | bitset2) << endl;
cout << "Bitwise OR using |=: " << (bitset1 |= bitset2)
<< endl;
cout << "Bitwise NOT: " << (result = ~bitset1) << endl;
bitset1 = 9;
cout << "Bitwise XOR: " << (bitset1 ^= bitset2) << endl;
bitset1 = 9;
cout << "Binary leftshift on bitwise1: "
<< (bitset1 <<= 1) << endl;
bitset1 = 9;
cout << "Binary rightshift on bitwise1: "
<< (bitset1 >>= 1) << endl;
return 0;
}
|
Output
Bitset1: 1001
Bitset2: 1010
Accessing bit value at index 1 of bitset1: 0
Bitwise AND using &: 1000
Bitwise AND using &=: 1000
Bitwise OR using |: 1011
Bitwise OR using |=: 1011
Bitwise NOT: 0100
Bitwise XOR: 0011
Binary leftshift on bitwise1: 0010
Binary rightshift on bitwise1: 0100
Difference between std::bitset and std::vector<bool> and an array of bool
Vector of bool and array of bool can also be implemented to store a sequence of boolean values like bitset but there are some differences between each implementation:
Definition |
A class template consisting of a sequence of bits stored such that each bit occupies 1 bit of memory. |
A variation of vectors of C++ STL in which each element is of size 1 bit and is of type bool |
A fixed size contiguous collection of bool data elements. |
Size |
Fixed Size. |
Dynamic Size. |
Fixed Size. |
Memory |
A single element occupies 1 bit of memory. |
A single element occupies 1 bit of memory. |
A single element occupies 1 byte of memory. |
Speed |
Same |
Same |
Faster |
Last Updated :
30 Jan, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...