IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Сдвиговые операции в кодировании, язык Си
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Прош мне помочь вот с чем: у меня есть коды фаффмана для каждого кодируемого символа. Так вот вопрос :
могли бы мне написать функцию которая бы упаковывала отдельные коды разной длины напрмер в переменную типа unsigned(2 байта). Здесб довольно тонкая работ со сдвиговыми операциями и у меня не получается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Ну, тогда смотри:

#include <stdio.h>
unsigned buffer, length_in_buff;

void pack_unsigned(unsigned value, unsigned len)
{
unsigned can_add, copy;
can_add = 8 * sizeof(unsigned) - length_in_buff;

if(can_add >= len) {
buffer <<= len;
buffer |= value;

length_in_buff += len;

if(can_add == len) {
printf("output buffer: %u\n", buffer); /* store buffer */
buffer = length_in_buff = 0;
}
}
else {
copy = value;
value >>= len - can_add;
buffer <<= can_add;
buffer |= value;

printf("output buffer: %u\n", buffer); /* store buffer */
copy <<= sizeof(unsigned) - (len - can_add);
copy >>= sizeof(unsigned) - (len - can_add);
buffer = copy;
length_in_buff = len - can_add;
}
}


int main() {
printf("sizeof(unsigned) = %d\n", sizeof(unsigned));
buffer = 0; length_in_buff = 0;

pack_unsigned(3, 9); /* 000000011 */
pack_unsigned(3, 9); /* 000000011 */
pack_unsigned(2, 7); /* 0000010 */
pack_unsigned(8, 7); /* 0001000 */
pack_unsigned(1, 5); /* 00001 */
printf("buffer = %u (should be 1)\n", buffer);
return 0;
}
pack_unsigned пишет в buffer первый параметр, записанный в поле из стольки бит, сколько указано во втором параметре (закомментированы как раз битовые последовательности, добавляемые к буферу)... Когда буфер заполняется, он "сбрасывается" либо в файл, либо (как у меня в программе) на экран, и все начинается сначала...

Теперь о выводе. buffer имеет размер в 32-бита, следовательно после 4-х вызовов pack_unsigned он заполнится, и будет содержать
00000001100000001100000100001000 = 2521524010
00001 - то, что остается в буфере после всех операций...

Что непонятно - спрашивай...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Янычар   Сдвиговые операции в кодировании   29.05.2008 23:33
klem4   Спасибо, поржал)) Ты бы пару примеров привел, б…   30.05.2008 1:36
Янычар   Честно говоря сам поражл щас)))) А пример попытаю…   30.05.2008 1:58
klem4   то есть каждый символ кодируется 3 битами, и ты хо…   30.05.2008 2:05
Янычар   Ну нет конечно. Я просто пример привел. Коды все р…   30.05.2008 2:12
volvo   Что-то я не понял твоей логики... Вот тут: метод Х…   30.05.2008 18:12
Янычар   Ну там и вправду не совсем то что мне нужно) А зде…   1.06.2008 0:02
volvo   Ну, тогда смотри: #include <stdio.h> unsign…   1.06.2008 0:22
Янычар   Ну в принципе все понятно спасибо, но есть один во…   1.06.2008 20:58
volvo   Ты не можешь записывать в файл информацию побитно,…   1.06.2008 22:18
Янычар   Спасибо понятно теперь. Хотя то что писать в файл …   1.06.2008 22:42
Янычар   Вот один вопрос возник а зачем нужно 00001 - то, ч…   4.06.2008 19:17
volvo   Это то, что после всех операций (и, соответственно…   4.06.2008 19:32
Янычар   Спасибо так оно и есть) Добавлено через 17 мин. …   4.06.2008 20:10


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 23:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name