La prima operazione è del tutto equivalente a questa:
codice:
package->ident = (msb << 3) + ((lsb & 0xE0) >> 5);
mettere un valore in AND bit a bit con -1 non ha alcun senso, in quanto lascia inalterato il valore.
Questa operazione prende i primi tre bit di lsb (quelli più significativi) e li aggiunge come bit meno significativi a msb. msb viene però privato dei suoi primi 3 bit e gli altri vengono shiftati a sinistra (lasciando degli zeri nei 3 bit meno significativi). Graficamente:
codice:
msb = xyzAAAAA
lsb = abcBBBBB
ident = AAAAAabc
La seconda operazione assegna a rtr il valore del quarto bit (a partire dal più significativo) di lsb. Graficamente:
codice:
lsb = BBBxBBBB
rtr = 0000000x
La terza operazione assegna a len il valore costituito dagli ultimi 4 bit (meno significativi) di lsb. Graficamente:
codice:
lsb = BBBBwxyz
len = 0000wxyz
Ciao.