Операции арифметического сдвига
От: Tronen  
Дата: 24.02.08 16:19
Оценка:
Привет всем!!!

Пытаюсь разобраться с исходниками арифметического кодера... Практически со всем разобрался, остается только один неясный момент...

Вот начало декодирования:

/*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.

Заранее благодарю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.