Как работает этот макрос?

Пытаюсь разобраться в коде, реализующем LZW-алгоритм. Не до конца понятно, как работает макрос записи слова в поток вывода. Вот сам макрос:

   #define WRITE_CODE(code,maxcode) do {                           \
int code_bits = (maxcode) < 1024 ?                          \
    ((maxcode) < 512 ? 8 : 9) :                             \
    ((maxcode) < 2048 ? 10 : 11);                           \
int extras = (1 << (code_bits + 1)) - (maxcode) - 1;        \
if ((code) < extras) {                                      \
    shifter |= ((long)(code) << bits);                      \
    bits += code_bits;                                      \
}                                                           \
else {                                                      \
    shifter |= ((long)(((code) + extras) >> 1) << bits);    \
    bits += code_bits;                                      \
    shifter |= ((long)(((code) + extras) & 1) << bits++);   \
}                                                           \
do { (*dst)(shifter); shifter >>= 8; output_bytes++;        \
} while ((bits -= 8) >= 8);                                 \
} while (0)

В зависимости от того, какой максимальный код мы передали, под слово выделяем от 8 до 11 бит. А вот дальше логика того, как работает макрос совсем не понятна. Прошу подробно объяснить.

  1. Что хранится в extras?
  2. Все операции связанные с shifter
  3. Почему во всех операциях с shifter приводим результат к long?

Наверное, нужен конкретный код. Пусть это будет 261, и каждое слово в словаре кодируется 12 битами. (maxcode 4096).


Ответы (0 шт):