<<
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
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
merci pour l'explication! – mspoerr
@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. –