Привет всем!!!
Пытаюсь разобраться с исходниками арифметического кодера... Практически со всем разобрался, остается только один неясный момент...
Вот начало декодирования:
/*BITS_IN_REGISTER = 16;
void start_decoding (void)
{
int i;
value = 0l;
for ( i = 1; i <= BITS_IN_REGISTER; i++)
value = 2 * value + input_bit (); /* получаем бит и декодируем */
low = 0l;
high = TOP_VALUE;
}
Эта операция берет 16 бит с исходного сообщения и превращает их в число типа long. Например есть последовательность b0101011101011000 1101100 (16 бит выделены отдельно)... Эти 16 бит превращаются в число 22360. Методом, который я знаю еще со школы получается так:
N bit bit*2^N
0 0 0
1 0 0
2 0 0
3 1 8
4 1 16
5 0 0
6 1 64
7 0 0
8 1 256
9 1 512
10 1 1024
11 0 0
12 1 4096
13 0 0
14 1 16384
15 0 0
22360 (сумма bit*2^N)
Т.е. функция start_decoding (void) делает value = 22360.
Каким образом получается это из цикла, приведенного выше — я никак понять не могу... Вот процедура input_bit():
/* эта функция возвращает значение текущего бита для обработки, т.е. либо 1 либо 0 */
int input_bit (void)
{
int t;
if (bits_to_go == 0) /* если нет больше бит, то */
{
buffer = getc (in); /* читаем следующий символ из потока */
if (buffer == EOF) /* если конец файла, то */
{
garbage_bits += 1; /* увеличиваем на 1 */
if (garbage_bits > BITS_IN_REGISTER - 2) /* если значение этой переменной стало больше, выходим с ошибкой */
{
printf ("éË®°™† ¢ ·¶†‚ƨ ‰†©´•\n");
exit (-1);
}
}
bits_to_go = 8; /* теперь имеем 8 бит для обработки */
}
/* предположим что buffer равен 3 ( 00000011 ) */
t = buffer & 1; /* в t сохраняем значение самого правого бита из buffer, 00000011, t будет равно 1 */
buffer >>= 1; /* сдвигаем buffer вправо на один бит, buffer станет ( 00000001 )
bits_to_go -= 1; /* уменьшаем количество бит для обработки */
return t; /* возвращаем t */
}
По приведенным сдесь комментариям я не разобрался, пардон... Разъясните пожалуйста не комментариями к коду (т.к. я C практически не знаю) а просто по порядку, как по ходу цикла меняется value, если последовательность равна b0101011101011000.
Заранее благодарю.