When working with Project Euler problems I often need large (> 10**7) bit array\'s.
My normal approach is one of:
bool* sieve = new bool[N];
bool sieve[
You might be interested in trying the BITSCAN library as an alternative. Recently an extension has been proposed for sparseness, which I am not sure is your case, but might be.
You can use a byte array and index into that. Index n
would be in byte index n/8
, bit # n%8
. (In case std::bitset is not available for some reason).
A 'bool' type isn't stored using only 1 bit. From your comment about the size, it seems to use 1 entire byte for each bool.
A C like way of doing this would be:
uint8_t sieve[N/8]; //array of N/8 bytes
element of array is:
result = sieve[index / 8] || (1 << (index % 8));
or
result = sieve[index >> 3] || (1 << (index & 7));
set 1 in array:
sieve[index >> 3] |= 1 << (index & 7);
For better or for worse, std::vector<bool>
will use bits instead of bool's, to save space. So just use std::vector
like you should have been in the first place.
If N
is a constant, you can use std::bitset
.
If N is known at compile time, use std::bitset, otherwise use boost::dynamic_bitset.
A 'bool' type isn't stored using only 1 bit. From your comment about the size, it seems to use 1 entire byte for each bool.
A C like way of doing this would be:
uint8_t sieve[N/8]; //array of N/8 bytes
and then logical OR bytes together to get all your bits:
sieve[0] = 0x01 | 0x02; //this would turn on the first two bits
In that example, 0x01 and 0x02 are hexadecimal numbers that represent bytes.