Изменения

Строка 73: Строка 73:  
     IntReader intreader(source);
 
     IntReader intreader(source);
 
     BitWriter bitwriter(dest);
 
     BitWriter bitwriter(dest);
     while(intreader.hasLeft())     
+
 
 +
     while (intreader.hasLeft())     
 
     {
 
     {
 
       int num = intreader.getInt();
 
       int num = intreader.getInt();
       int l = log2(num);
+
       int numberBits = log2(num);
   −
       //поместить l нулей, чтобы показать, сколько бит будут следовать
+
       // поместить l нулей, чтобы показать, сколько бит будут следовать
       for (int a=l-1; a >=0; a--)
+
       for (int a = numberBits - 1; a >= 0; a--)
 
       {       
 
       {       
 
           bitwriter.putBit(false);
 
           bitwriter.putBit(false);
 
       }
 
       }
   −
       //скопировать l+1 битов числа
+
       // скопировать (numberBits + 1) битов числа
       for (int a=l; a >= 0; a--)
+
       for (int a = numberBits; a >= 0; a--)
 
       {
 
       {
 
           if (num & (1 << a))
 
           if (num & (1 << a))
Строка 93: Строка 94:  
       }
 
       }
 
     }
 
     }
 +
 
     intreader.close();
 
     intreader.close();
 
     bitwriter.close();
 
     bitwriter.close();
 
}
 
}
 +
 
// Декодирование
 
// Декодирование
 
void eliasGammaDecode(char* source, char* dest)
 
void eliasGammaDecode(char* source, char* dest)
 
{
 
{
 
     BitReader bitreader(source);
 
     BitReader bitreader(source);
     BitWriter bitwriter(dest);
+
     IntWriter intwriter(dest);
    int numberBits = 0;
+
 
     while(bitreader.hasLeft())
+
     while (bitreader.hasLeft())
 
     {
 
     {
         while(!bitreader.getBit() || bitreader.hasLeft())numberBits++; //продолжить чтение пока не встретится единица...
+
         int numberBits = 0;
         int current = 0;
+
 
        for (int a=0; a < numberBits; a++) //прочитать numberBits битов
+
        // продолжить чтение пока не встретится единица...
 +
         while (bitreader.getBit() == false)
 
         {
 
         {
             if (bitreader.getBit())
+
            numberBits++;
              current += 1 << a;
+
 
 +
             if (!bitreader.hasLeft())
 +
            {
 +
                // неожиданный конец потока битов
 +
                // аварийный выход
 +
                // игнорируем уже прочитанные биты
 +
                return;
 +
            }
 
         }
 
         }
        //записать его как 32-битное число
+
 
+
         if (numberBits > (sizeof(int) * BITS_PER_BYTE - 1))
         current = current | ( 1 << numberBits ) ;//последний бит не декодируется!
  −
        for (int a=0; a < 32; a++) //прочитать numberBits битов
   
         {
 
         {
             if (current & (1 << a))
+
             // переполнение целочисленного типа
              bitwriter.putBit(true);
+
            // входной поток содержит неверные данные
             else
+
            // аварийный выход
              bitwriter.putBit(false);
+
             // игнорируем уже прочитанные биты
 +
            return;
 
         }
 
         }
 +
 +
        int num = 1;
 +
 +
        // прочитать numberBits битов
 +
        for (; numberBits > 0; numberBits--)
 +
        {
 +
            if (!bitreader.hasLeft())
 +
            {
 +
                // неожиданный конец потока битов
 +
                // аварийный выход
 +
                // игнорируем уже прочитанные биты
 +
                return;
 +
            }
 +
 +
            num = num << 1;
 +
 +
            if (bitreader.getBit() == true)
 +
              num = num | 1;
 +
        }
 +
 +
        intwriter.putInt(num);
 
     }
 
     }
 +
 +
    intreader.close();
 +
    bitwriter.close();
 
}
 
}
 
</source>
 
</source>
Анонимный участник