Меняет местами n-й и m-й байты.
Старт имеет два параллельных вычисления: одну последовательность с n
и одну последовательность с m
, которые выбирают n-й и m-й байты следующим образом:
Шаг 1: 0xff << n8
0x000000ff << 0 = 0x000000ff
.. 8 = 0x0000ff00
.. 16 = 0x00ff0000
.. 24 = 0xff000000
Шаг 2: x & n_mask
x = 0xDDCCBBAA
x & 0x000000ff = 0x000000AA
x & 0x0000ff00 = 0x0000BB00
x & 0x00ff0000 = 0x00CC0000
x & 0xff000000 = 0xDD000000
Шаг 3: ((x & n_mask) >> n8) & 0xff
(примечание: & 0xff
требуется, посколькуСдвиг вправо, скорее всего, будет арифметическим сдвигом вправо, он не потребуется, если код работает с целыми числами без знака)1020 *
То же самое делается для m
.
leftover
- это другие (2 или 3) байта, те, которые не были извлечены предыдущим процессом. Осталось 3 байта, потому что n и m могут быть одинаковыми.
Наконец, последний шаг - собрать все вместе, но с байтом, извлеченным из n-й позиции, смещенным в m-ю позицию,и m-й байт сместился в n-ую позицию, поэтому они меняются местами.