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