Изменения
Перейти к навигации
Перейти к поиску
Строка 73:
Строка 73:
− +
−
− +
− +
− // поместить numberBits нулей, чтобы показать, сколько бит будут следовать
−
− +
− +
− +
−
− if (num & (1 << a))+
− bitwriter.putBit(true);+
− else+
− bitwriter.putBit(false);+
−
−
− IntWriter intwriter(dest); +
− +
− +
− int numberBits = 0; +
− +
− // продолжить чтение пока не встретится единица...+
− while (bitreader.getBit() == false)
− numberBits++;+
− +
−
− {
− // неожиданный конец потока битов
− // аварийный выход
− // игнорируем уже прочитанные биты
− 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();
отмена правок участника 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>