Subject: New carryless Date: Thu, 23 Aug 2001 03:23:19 +0000 (UTC) From: "Eugene D. Shelwien" Organization: Shadow Research Center Newsgroups: fido7.ru.compress Hi! Изобрелся сабж. Идея состоит в том, что ежели взять субботинский кодер и расширить low до восьми байт, то получится CL-R, интересный тем, что никакой заметной потери эффективности по сравнению с "шиндлеровским" кодером у него нет. Поскольку range у нас остается четырехбайтовым, то единственный способ переполнения qword'ового low - это перенос при суммировании range с младшим dword'ом low, когда старший dword равен 0xFFFFFFFF. Так вот, если мы при таком значении старшего dword'а возьмем, да и переинициализируем кодер, то никакого переполнения qword'а так и не произойдет. А поскольку четверки FF'ов в реальном коде практически не встречаются, то потерять десяток байт, если все-таки вдруг, имхо не особенно жалко. Зато пропадает всякая необходимость считать в декодере low. Т.е., отслеживать появление четверки FF'ов таки придется, конечно. Но это можно делать при нормализации. В общем, получаем простой кодировщик, как в субботинском кодеке и простой декодировщик, как в "шиндлеровском". Полное счастье ;). Вот только рассказал бы мне кто, как уговорить IntelC не inline'ить эти дурацкие вызовы Start/Finish? Из-за них экзешник получается на 4k больше, чем нужно, и имхо чуть подтормаживает... :( Счастливо! - Шелвин ---- СLRf.inc #define DO(n) for (int _=0; _>56 ), low<<=8; } void FinishDecode( void ) {} void Encode (uint cumFreq, uint freq, uint totFreq) { low += cumFreq * (range/= totFreq); range*= freq; if( range>8); while( range=0xF0 ) FinishDecode(), StartDecode(); } } };