2009-02-23 7 views
0

J'ai vu ce qui suit posté par l'un des camarades stackoverflower et cela me stupéfie en quelque sorte.Shift opérations

Quelqu'un expliquer les opérations de décalage dans le code suivant: est le nombre de bits qui peuvent être stockées dans « b » (qui est un entier non signé

std::vector<bool> a; 
a.push_back(true); 
a.push_back(false); 
//... 
for (auto it = a.begin(); it != a.end();) // see 0x for meaning of auto 
{ 
    unsigned b = 0; 
    for (int i = 0; i < 8*sizeof(b); ++i) 
    { 
     b |= (*it & 1) << (8*sizeof(b) - 1 - i); 
     ++it; 
    } 
    // flush 'b' 
} 
+0

Fondamentalement une copie d'un tas de questions. Un exemple: http: // stackoverflow.com/questions/141525/absolu-débutants-guide-à-bits-décalage – Dana

+0

Merci, je vais jeter un oeil à ceux ... –

+0

Haha, Hey, j'ai écrit que ...: P –

Répondre

3

8 * sizeof (b), à savoir typiquement 32 ou 64 bits).

Qu'est-ce que le code fait est qu'il emballe les valeurs booléennes dans le vecteur « a » pour devenir bits « b ». "1" évalue à 1 si la valeur booléenne à * est VRAI, sinon 0. Le bit est alors décalé à gauche 32 bits moins 1 moins l'indice "i", c'est-à-dire décalé à gauche de zéro à 31 morceaux. Cela signifie maintenant que le premier élément de 'a' contrôlera le bit le plus significatif sur 'b' (décalage gauche 31), le deuxième élément le deuxième bit le plus significatif sur 'b' (décalage gauche 30), etc. les changements sont l'arithmétique, à savoir quel que soit l'ordre des octets ou bits, x < < 1 est toujours x * 2.

Ainsi, par exemple, si votre vecteur a le premier et l'ensemble des éléments 30, « b » devrait contenir par la fin de la journée le nombre binaire 10000000 00000000 00000000 00000100.

0

la réponse de antti.huima regarde droit à moi.

Cependant il peut y avoir un bug dans la procédure. La boucle externe va de a.begin à a.end, cependant la boucle interne incrémente "it" indépendamment du fait que cela la fasse "dépasser".

si vous passez un vecteur avec une taille « bizarre », disent 33 entrées, le résultat pourrait être incorrect.

Cela ne peut être un bug si la taille du vecteur est guarenteed (mais peut-être il devrait être testé que la longueur est valide).

0

Qu'est-ce qui se passe là-bas:

(*it & 1) 

cela devrait être 0 ou 1 selon le bool être vrai ou faux; noter cependant que bools sont toujours 0 ou 1 pour ce qui pourrait être juste (non signé) * il

<< (8*sizeof(b) - 1 - i) 

Ceci est un changement qui se déplace le bit de thi position la plus adroite au i -ème de la la gauche. Nous décalons un nombre qui a au plus un bit défini, donc ceci aura i -th bit le plus à gauche ou non. Le reste des bits est zéro.

b |= ... 

Ceci définit les bits b, qui sont dans l'ERS.

i++; 

Passez au numéro d'entrée suivant. Veillez à rester dans la plage d'entrée.

Ce qui signifie que tout va bits dans b, correspondant aux éléments vectoriels qui sont vraies.