L'opérateur "&" permet d'effectuer un "ET" binaire sur chacun des bits.
La variable "mask" est initialisée à 1, puis à chaque tour de boucle, les bits sont décalés d'un cran à gauche :
1 2 3 4 5 6 7
|
76543210 <- numéro du bit
00000001 <- 1er tour de boucle
00000010 <- 2eme tour de boucle
00000100 <- 3eme tour de boucle
etc |
La condition
!(a & mask) && (b & mask)
se découpe en deux parties :
1) Ici, on teste le nième bit de "a", puis de renverser le résultat (à cause du "!"). Ce test renvoie donc vrai si le nième bit est à 0.
2) Ici, on teste le nième bit de "b". Ce test renvoie donc vrai si le nième bit est à 1.
3) Le "&&" est l'opérateur ET, et renvoie 1 (vrai) si les deux opérandes sont vraies, c'est-à-dire ici si le nième bit de "a" vaut 0, et celui de "b" vaut 1.
Le but de la manoeuvre est donc de trouver à quelle position, à partir de la droite, se trouve un bit de "a" à 0 et, à cette même position, un bit de "b" à 1.
Si c'est le cas, la fonction renvoie "d - i", "i" étant cette position. Je suppose que "d" est la taille du type en question.
Exemple :
1 2 3 4 5 6
|
d = 8 (taille de "a" et "b")
76543210 <- numéro du bit
a = 00010011
b = 10010110 |
Position trouvée : 2
La fonction renvoie 8 - 2
Partager