2017-07-04 2 views
2

J'ai un service distant qui reçoit un certain nombre de paramètres et un entier pour signaler ceux qui sont nuls:Comment définir les bits?

byte<(param_count + 7)/8> null bitmap 

J'ai essayé une mise en œuvre naïve, mais depuis que je suis pas d'expérience en décalage de bits I'D plutôt ne pas le montrer. Donc, étant donné un vecteur de booléens, comment puis-je créer mon bitmap?

+1

'std :: vector ' est un bitmap. Tout comme 'std :: bitset': http://fr.cppreference.com/w/cpp/utility/bitset – Jonas

+0

Comment transformer un' std :: vector 'en un entier? – ruipacheco

+0

Si vous utilisez un 'bitset', vous pouvez utiliser la méthode' to_ulong'. L'implémentation du vecteur peut utiliser un bitet sous le capot mais il n'a pas à le faire. –

Répondre

4

Si param_count est connu au moment de la compilation, vous pouvez utiliser std::bitset. Voici un exemple:

// Define a bitmap with 'param_count + 7' elements 
std::bitset<param_count + 7> b; 

// Set the fifth bit, zero is the first bit 
b[4] = 1; 

// Convert to 'unsigned long', and the casting it to an int. 
int a = int(b.to_ulong()); 

Si param_count est pas connu au moment de la compilation, vous pouvez utiliser std::vector<bool>. Voici un autre exemple:

// Define a bitmap with 'param_count + 7' elements 
std::vector<bool> b(param_count + 7); 

// Set the fifth bit, zero is the first bit 
b[4] = 1; 

// Convert to 'int' 
int a = std::accumulate(b.rbegin(), b.rend(), 0, [](int x, int y) { return (x << 1) + y; }); 

La conversion de std::vector<bool> à int est tiré de this answer.

+0

@ Rakete1111 Vous avez raison, j'ajoute une version 'vector '. – Jonas

+0

param_count n'est pas connu au moment de la compilation. – ruipacheco