Вот шестнадцатеричное значение 0x12345678, записанное в двоичном формате и аннотированное некоторыми битовыми позициями:
|31 24|23 16|15 8|7 bit 0|
+---------------+---------------+---------------+---------------+
|0 0 0 1 0 0 1 0|0 0 1 1 0 1 0 0|0 1 0 1 0 1 1 0|0 1 1 1 1 0 0 0|
+---------------+---------------+---------------+---------------+
... а вот 0x000000FF:
+---------------+---------------+---------------+---------------+
|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|1 1 1 1 1 1 1 1|
+---------------+---------------+---------------+---------------+
побитовое И выбирает только нижние 8 битов исходного значения:
+---------------+---------------+---------------+---------------+
|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 1 1 1 1 0 0 0|
+---------------+---------------+---------------+---------------+
... и сдвигая его влево на 24 бита, перемещает его из нижних 8 битов в верхнее:
+---------------+---------------+---------------+---------------+
|0 1 1 1 1 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
+---------------+---------------+---------------+---------------+
... что составляет 0x78000000 в шестнадцатеричном формате.
Другие части работают с оставшимися 8-битными частями ввода:
0x12345678
& 0x000000FF
----------
0x00000078 << 24 = 0x78000000 (as shown above)
0x12345678
& 0x0000FF00
----------
0x00005600 << 8 = 0x00560000
0x12345678
& 0x00FF0000
----------
0x00340000 >> 8 = 0x00003400
0x12345678
& 0x00000000
----------
0x12000000 >> 24 = 0x00000012
| ----------
0x78563412
, поэтому общий эффект заключается в рассмотрении 32-битное значение ldata
как последовательность из четырех 8-битных байтов и обратный порядок.