2010-08-26 3 views

Répondre

6

<< est le bitwise left shift operator; il décale les bits d'une valeur laissée par le montant donné. Ainsi, 1L<<(32-maskbits) décale la valeur 1 vers la gauche 32-maskbits fois.

& est le bitwise AND operator. Ainsi, l'expression de boucle mask & (1L<<(32-maskbits)) == 0 teste tous les bits compris dans la valeur mask, de bas en haut. La boucle s'arrêtera sur le premier bit (le plus bas) non nul de mask, auquel point maskbits contiendra le nombre de bits au-dessus (et incluant) ce bit.

E.g.

  • si mask == 0xFFFF mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111), la boucle arrêt sur la première itération, et maskbits aura 32
  • si mask == 0x0001 mask == 0x00000001 (== binary 00000000000000000000000000000001), la boucle sera de nouveau arrêter sur la première itération, et maskbits aura 32
  • si mask == 0x1000 mask == 0x01000000 (== binary 00000001000000000000000000000000), la boucle s'arrêtera sur l'itération 24, et maskbits aura 8
+0

question: Je reçois l'opération ET pour vérifier quand arrêter les bits de comptage, je ne comprends pas pourquoi l'aide de la gauche décalage avec un long int. '1' n'était pas suffisant? – dierre

+0

merci pour l'explication! – mspoerr

+1

@dierre, pour éviter le débordement d'entier. Sur certaines plates-formes, un 'int' ne fait que 16 bits, et si vous quittez une valeur' int' de plus de 16, le résultat est indéfini (peut être 0). La déclaration de la valeur «long» garantit qu'elle est longue d'au moins 32 bits. –

1

Pour voir ce qui se passe: exécutez-le.

#include <stdio.h> 
#include <iostream> 
using namespace std; 

char *binary (unsigned int v) { 
static char binstr[33] ; 
int i ; 

binstr[32] = '\0' ; 
for (i=0; i<32; i++) { 
binstr[31-i] = v & 1 ? '1' : '0' ; 
v = v/2 ; 
} 

return binstr ; 
} 

int main(void){ 

    unsigned long maskbits,mask; 

mask = 0x01000000; 
cout << "MASK IS: " << binary(mask) << "\n"; 
cout << "32 is: " << binary(32) << "\n\n"; 
for (maskbits=32 ; (mask & (1L<<(32-maskbits))) == 0 ; maskbits--) { 
cout << "maskbits: " << binary(maskbits) << "\n"; 
cout << "\t(32-maskbits): " << binary((32-maskbits)) << "\n"; 
cout << "\t1L<<(32-maskbits): " << binary((1L<<(32-maskbits))) << "\n"; 
cout << "\t(mask & (1L<<(32-maskbits))): " << binary((mask & (1L<<(32-maskbits)))) << "\n\n"; 

} 

cout << "\nFinal maskbits: " << maskbits; 

return 0; 
} 

http://ideone.com/eB8Kp

+0

merci pour le bon exemple! – mspoerr

Questions connexes