Изменения
→Пример программного кода
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))
}
}
}
}
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);
while(bitreader.hasLeft())
while (bitreader.hasLeft())
{
{
int numberBits = 0;
// продолжить чтение пока не встретится единица...
while (bitreader.getBit() == false)
{
{
if (bitreader.getBit())
numberBits++;
if (!bitreader.hasLeft())
{
// неожиданный конец потока битов
// аварийный выход
// игнорируем уже прочитанные биты
return;
}
}
}
if (numberBits > (sizeof(int) * BITS_PER_BYTE - 1))
{
{
// переполнение целочисленного типа
// входной поток содержит неверные данные
// аварийный выход
// игнорируем уже прочитанные биты
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>