vector<bool>
con una capienza pari al numero di bit del tipo intero considerato, e viceversa:- Codice:
#include <iostream>
#include <bitset>
#include <chrono>
#include <cstdint>
#include <vector>
using namespace std;
using namespace std::chrono;
const uint8_t N = 64;
vector<bool> to_bool(uint64_t n)
{
vector<bool> b(N);
for(uint8_t i = N - 1; n; n >>= 1)
{
b[i--] = 1 & n;
}
return b;
}
uint64_t from_bool(const vector<bool> &b)
{
uint64_t n = 0;
uint64_t m = (uint64_t)1 << N - 1;
for(uint8_t i = 0; m; m >>= 1)
{
if(b[i++])
{
n |= m;
}
}
return n;
}
int main()
{
uint64_t n = 123456789987654321;
//----------------------------------------------------------------------------------
auto start1 = high_resolution_clock::now();
for(uint64_t i = 0; i < 5000000; ++i)
{
vector<bool> b = to_bool(n);
n = from_bool(b);
}
auto stop1 = high_resolution_clock::now();
cout << duration_cast<milliseconds>(stop1 - start1).count() << " ms\t\t" << n << endl;
//----------------------------------------------------------------------------------
auto start2 = high_resolution_clock::now();
for(uint64_t i = 0; i < 5000000; ++i)
{
bitset<N> bs(n);
n = bs.to_ullong();
}
auto stop2 = high_resolution_clock::now();
cout << duration_cast<milliseconds>(stop2 - start2).count() << " ms\t\t" << n << endl;
}
Secondo voi va bene o si potrebbe fare di meglio?
Inoltre nel main() ho anche cercato di testare l'efficienza dei
bitset
nel compiere le stesse operazioni, ma nel lanciare il programma ottengo il seguente output:- Codice:
1519 ms 123456789987654321
0 ms 123456789987654321
Process returned 0 (0x0) execution time : 1.556 s
Press any key to continue.
Non penso che le operazioni con i bitset siano tanto veloci, forse il comportamento riscontrato è dovuto a qualche ottimizzazione del compilatore che impedisce di richiamare più volte le stesse operazioni?
Infine vorrei approfittarne per chiedere un'altra cosa: è possibile fare in modo che una funzione ritorni un riferimento ad un elemento di un bitset, in modo da poter utilizzare il valore ritornato anche come l-value?
Leggendo la documentazione dei bitset ho capito che l'oggetto ritornato dovrebbe essere un
bitset::reference
, ma non mi compila.