Привет всем!!!
Пытаюсь разобраться с исходниками арифметического кодера... Практически со всем разобрался, остается только один неясный момент...
Вот начало декодирования:
/*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.
Заранее благодарю.
Здравствуйте, Tronen, Вы писали:
T>По приведенным сдесь комментариям я не разобрался, пардон... Разъясните пожалуйста не комментариями к коду (т.к. я C практически не знаю) а просто по порядку, как по ходу цикла меняется value, если последовательность равна b0101011101011000.
Вот так и меняется:
b0
b01
b010
b0101
b01010
b010101
b0101011
b01010111
b010101110
b0101011101
b01010111010
b010101110101
b0101011101011
b01010111010110
b010101110101100
b0101011101011000
, только вопрос не понятен...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, VEAPUK, Вы писали:
VEA>Здравствуйте, Tronen, Вы писали:
T>>По приведенным сдесь комментариям я не разобрался, пардон... Разъясните пожалуйста не комментариями к коду (т.к. я C практически не знаю) а просто по порядку, как по ходу цикла меняется value, если последовательность равна b0101011101011000.
VEA>Вот так и меняется:
VEA>VEA>b0
VEA>b01
VEA>b010
VEA>b0101
VEA>b01010
VEA>b010101
VEA>b0101011
VEA>b01010111
VEA>b010101110
VEA>b0101011101
VEA>b01010111010
VEA>b010101110101
VEA>b0101011101011
VEA>b01010111010110
VEA>b010101110101100
VEA>b0101011101011000
VEA>
VEA>, только вопрос не понятен...
Вот Вы и привели ответ :)... В этом вопрос и заключался... Правда я уже сам разобрался, но все равно — спасибо.