Je vais peut-être dire un truc que tu avais déjà compris, mais au cas où.
La trame que ton code lis depuis le bus I2C contient deux informations : ir et full. Une trame est représentée sous forme d'un uint32 composé donc de 4 bytes. Or, dans cet uint32 il y a deux informations. Pour les récupérer séparément, il faut donc "couper" ton uint32 en deux morceaux de 2 bytes chacun.
L'opérateur >> est appelé "right shift", c'est à dire que chaque bit de ton nombre est décalé vers la droite d'autant que la valeur donnée. Les bits à droite qui "dépassent" après décalage disparaissent, et on ajoute des 0 pour remplir à gauche.
Exemple : 10011010 >> 3 = 00010011.
L'opérateur & est utilisé ici comme un "mask" : on compare deux séries de bits un à un, et vu que c'est un opérateur "and", le bit résultant de l'opération sera 1 si les deux valent 1, 0 sinon.
Exemple : 00001111 & 00111100 = 00001100.
Revenons à ton nombre lum. Les deux premiers bytes contiennent la valeur de ir, et les deux derniers la valeur de full. Pour les récupérer, on utilise les opérateur précédemment expliqués.
Si on fait un décalage de 16 bits vers la droite, alors il ne reste plus que les deux premiers bytes puisque les deux bytes à droites disparaissent et sont remplacés par les deux bytes gauches. Deux bytes de 0 apparaissent à gauche, ce qui ne change rien à la valeur.
Si on applique un mask de 0xFFFF, cela correspond à deux bytes de 0 suivis de deux bytes de 1. Quelle que soit la valeur des deux bytes de gauche de lum, l'opération sera toujours b & 0 résultant donc en 0. Pour les deux bytes de droite, l'opération sera toujours b & 1 résultant donc en 1. Au final, ton nombre prendra donc la valeur des deux bytes de droite.
Et voilà, on a extrait deux valeurs à partir d'une seule.
Message édité le 07 mai 2017 à 16:59:58 par Blaff5