A bitset is an array of boolean values, but each boolean value is not stored separately. Instead, bitset optimizes the space such that each bool takes 1-bit space only, so space taken by bitset say, bs is less than that of bool bs[N] and vector<bool> bs(N). However, a limitation of bitset is, N must be known at compile-time, i.e., a constant (this limitation is not there with vector and dynamic array)
Important Note:
- Take care of integer overflow say if bitset is declared of size 3 and addition results 9, this is the case of integer overflow because 9 cannot be stored in 3 bits.
- Take care for negative results as bitsets are converted to unsigned long integer, so negative numbers cannot be stored.
Addition of 2 bitsets: Follow the steps below to solve the problem:
- Initialize a bool carry to false.
- Create a bitset ans to store the sum of the two bitsets x and y.
- Traverse the length of the bitsets x and y and use the fullAdder function to determine the value of the current bit in ans.
- Return ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool fullAdder( bool b1, bool b2, bool & carry)
{
bool sum = (b1 ^ b2) ^ carry;
carry = (b1 && b2) || (b1 && carry) || (b2 && carry);
return sum;
}
bitset<33> bitsetAdd(bitset<32>& x, bitset<32>& y)
{
bool carry = false ;
bitset<33> ans;
for ( int i = 0; i < 33; i++) {
ans[i] = fullAdder(x[i], y[i], carry);
}
return ans;
}
int main()
{
bitset<32> a(25);
bitset<32> b(15);
bitset<33> result = bitsetAdd(a, b);
cout << result;
return 0;
}
|
Output
000000000000000000000000000101000
Time Complexity: O(N), N is length of bitset
Auxiliary Space: O(N)
Subtraction of 2 bitsets: Follow the steps below to solve the problem:
- Initialize a bool borrow to false.
- Create a bitset ans to store the difference between the two bitsets x and y.
- Traverse the length of the bitsets x and y and use the fullSubtractor function to determine the value of the current bit in ans.
- Return ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool fullSubtractor( bool b1, bool b2, bool & borrow)
{
bool diff;
if (borrow) {
diff = !(b1 ^ b2);
borrow = !b1 || (b1 && b2);
}
else {
diff = b1 ^ b2;
borrow = !b1 && b2;
}
return diff;
}
bitset<33> bitsetSubtract(bitset<32> x, bitset<32> y)
{
bool borrow = false ;
bitset<33> ans;
for ( int i = 0; i < 32; i++) {
ans[i] = fullSubtractor(x[i], y[i], borrow);
}
return ans;
}
int main()
{
bitset<32> a(25);
bitset<32> b(15);
bitset<33> result = bitsetSubtract(a, b);
cout << result;
return 0;
}
|
Output
000000000000000000000000000001010
Time Complexity: O(N), N is length of bitset
Auxiliary Space: O(N)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
17 Jun, 2021
Like Article
Save Article