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