Как работает этот макрос?
Пытаюсь разобраться в коде, реализующем 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 бит. А вот дальше логика того, как работает макрос совсем не понятна. Прошу подробно объяснить.
- Что хранится в extras?
- Все операции связанные с
shifter - Почему во всех операциях с
shifterприводим результат кlong?
Наверное, нужен конкретный код. Пусть это будет 261, и каждое слово в словаре кодируется 12 битами. (maxcode 4096).