Изменения

отмена правок участника 90.149.3.28 предлагаемый код с ошибками и затемняет алгоритм лишними действиями
Строка 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 numberBits = log2(num);
+
       int l = log2(num);
 
+
       for (int a=0; a < l; a++)
      // поместить numberBits нулей, чтобы показать, сколько бит будут следовать
  −
       for (int a = numberBits - 1; a >= 0; a--)
   
       {       
 
       {       
           bitwriter.putBit(false);
+
           bitwriter.putBit(false); //поместить нули, чтобы показать, сколько бит будут следовать
 
       }
 
       }
 
+
       bitwriter.putBit(true); //пометить конец нолей
       // скопировать (numberBits + 1) битов числа
+
       for (int a=0; a < l; a++) //записать биты как простые двоичные числа
       for (int a = numberBits; a >= 0; a--)
   
       {
 
       {
          if (num & (1 << a))
+
                  if (num & (1 << a))
              bitwriter.putBit(true);
+
                    bitwriter.putBit(true);
          else
+
                  else
              bitwriter.putBit(false);
+
                    bitwriter.putBit(false);
 
       }
 
       }
 
     }
 
     }
   
     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);
     IntWriter intwriter(dest);
+
     BitWriter bitwriter(dest);
 
+
    int numberBits = 0;
     while (bitreader.hasLeft())
+
     while(bitreader.hasLeft())
 
     {
 
     {
         int numberBits = 0;
+
         while(!bitreader.getBit() || bitreader.hasLeft())numberBits++; //продолжить чтение пока не встретится единица...
 
+
         int current = 0;
        // продолжить чтение пока не встретится единица...
+
        for (int a=0; a < numberBits; a++) //прочитать numberBits битов
         while (bitreader.getBit() == false)
   
         {
 
         {
            numberBits++;
+
             if (bitreader.getBit())
 
+
              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>
Анонимный участник