Проблемы с пониманием куска кода. Побитовые операции в c - PullRequest
0 голосов
/ 04 октября 2019

У меня есть следующий сегмент кода, и мне не удается расшифровать, что он делает.

/* assume 0 <= n <=3 and 0 <= m <=3 */
    int n8= n <<3;
    int m8 = m <<3;
        int n_mask = 0xff << n8;
    int m_mask = 0xff << m8; // left bitshifts 255 by the value of m8
    int n_byte = ((x & n_mask) >> n8) & 0xff;
    int m_byte = ((x & m_mask) >> m8) & 0xff;
    int bytes_mask = n_mask | m_mask ;
    int leftover = x & ~bytes_mask;
    return ( leftover | (n_byte <<m8)| (m_byte << n8) );

1 Ответ

2 голосов
/ 05 октября 2019

Меняет местами 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-ую позицию, поэтому они меняются местами.

...