Изменения
оформление списка табличной вики-разметкой, стилевые правки
Начало кодирования:
Начало кодирования:
{| class="standard" style="text-align:right"
! Число || Значение || Кодирование || Предполагаемая<br />вероятность
|-
| 1 || 2<sup>0</sup> + 0 || 1 || 1/2
|-
| 2 || 2<sup>1</sup> + 0 || 01 0 || 1/8
|-
| 3 || 2<sup>1</sup> + 1 || 01 1 || 1/8
|-
| 4 || 2² + 0 || 001 00 || 1/32
|-
| 5 || 2² + 1 || 001 01 || 1/32
|-
| 6 || 2² + 2 || 001 10 || 1/32
|-
| 7 || 2² + 3 || 001 11 || 1/32
|-
| 8 || 2³ + 0 || 0001 000 || 1/128
|-
| 9 || 2³ + 1 || 0001 001 || 1/128
|-
|10 || 2³ + 2 || 0001 010 || 1/128
|-
|11 || 2³ + 3 || 0001 011 || 1/128
|-
|12 || 2³ + 4 || 0001 100 || 1/128
|-
|13 || 2³ + 5 || 0001 101 || 1/128
|-
|14 || 2³ + 6 || 0001 110 || 1/128
|-
|15 || 2³ + 7 || 0001 111 || 1/128
|-
|16 || 2<sup>4</sup> + 0 || 00001 0000 || 1/512
|-
|17 || 2<sup>4</sup> + 1 || 00001 0001 || 1/512
|-
|… || || ||
|}
Распределение предполагаемых вероятностей для кодов добавлено для ясности.
Распределение предполагаемых вероятностей для кодов добавлено для понятности.
Чтобы декодировать закодированное гамма-кодом Элиаса число следует:
Чтобы декодировать закодированное гамма-кодом Элиаса число следует:
for (int a=0; a < l; a++)
for (int a=0; a < l; a++)
{
{
bitwriter.putBit(false); //поместите ноли, чтобы показать сколько бит будут следовать
bitwriter.putBit(false); //поместить нули, чтобы показать, сколько бит будут следовать
}
}
bitwriter.putBit(true);//пометьте конец нолей
bitwriter.putBit(true); //пометить конец нолей
for (int a=0; a < l; a++) //напишите биты как простые двоичные числа
for (int a=0; a < l; a++) //записать биты как простые двоичные числа
{
{
if (num & (1 << a))
if (num & (1 << a))
while(bitreader.hasLeft())
while(bitreader.hasLeft())
{
{
while(!bitreader.getBit() || bitreader.hasLeft())numberBits++; //продолжаем вычитку пока не достигнем единицы...
while(!bitreader.getBit() || bitreader.hasLeft())numberBits++; //продолжить чтение пока не встретится единица...
int current = 0;
int current = 0;
for (int a=0; a < numberBits; a++) //считывание битов numberBits
for (int a=0; a < numberBits; a++) //прочитать numberBits битов
{
{
if (bitreader.getBit())
if (bitreader.getBit())
current += 1 << a;
current += 1 << a;
}
}
//запишите его как 32х битное число
//записать его как 32-битное число
current= current | ( 1 << numberBits ) ;//последний бит не декодируется!
current = current | ( 1 << numberBits ) ;//последний бит не декодируется!
for (int a=0; a < 32; a++) //Read numberBits bits
for (int a=0; a < 32; a++) //прочитать numberBits битов
{
{
if (current & (1 << a))
if (current & (1 << a))