Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18

Биты и байты в алгоритме Хаффмана

14.12.2013, 00:54. Показов 1630. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу на С, в которой нужно реализовать метод кодирования Хаффмана. Код не буду прикладывать, так как в нём в принципе для меня всё понятно. В общем читаю я из текстового файла информацию, проходит этап кодировки, хоть и дерево неправильно строится, но меня этот вопрос пока не волнует. Меня вот что волнует: записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит, что приводит к тому, что бинарный файл, который должен быть сжатым вроде как, становится больше текстового файла, который я кодирую. Так вот вопрос: как сделать так, чтобы 0 и 1 принимались в бинарном файле как 1 бит?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2013, 00:54
Ответы с готовыми решениями:

Байты в биты
Здравствуйте коллеги! Подскажите пожалуйста,каким образом можно байт разложить на составляющие биты. 1байт в 8 бит??? допустим у...

Биты и байты
Сколько нужно битов для адресации 64560 килобайтов, 2 мегабайта, 17 мегабайтов, 5 гигабайтов?

Байты в биты
Как перевести байты в биты, причем так, чтобы самому можно было выбирать, какие биты бы соответствовали байтам. То есть, к примеру, символ...

9
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
14.12.2013, 00:59
Цитата Сообщение от BlindDespair Посмотреть сообщение
записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит,
наверно потому что в Си минимальная единица char, она же байт
ни о каких битах он не знает,хотя есть такие диалекты( для микроконтроллеров) которые могут с битами работать, но это уже экзотика
так что упаковывай 8 бит в один unsigned char, или смирись с тем что тебе под 0 и 1 выделяется целый байт
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:01  [ТС]
А можно поподробнее по поводу 8 бит в unsignet char?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
14.12.2013, 01:26
Цитата Сообщение от BlindDespair Посмотреть сообщение
А можно поподробнее по поводу 8 бит в unsignet char?
ну например у тебя есть массив 1 и 0( 8 штук)
C++
1
2
3
unsigned char res=0;
for(int i=0;i<8;i++)
 res|=(arr[i]&0x01)<<i;
доставать так, у тебя будет куча char
C++
1
2
3
4
bool fncGet( int bt, unsigned char * arrByte)
 {
  return  (arrByte[bt/8]&(1<<(bt%8)))!=0;
 }
установить отдельный бит так
C++
1
2
3
4
5
6
bool fncSet( int bt, bool val,unsigned char * arrByte)
 {
  arrByte[bt/8]&=~(1<<(bt%8));// обнулим нужный бит
  arrByte[bt/8]|=val<<(bt%8);  // установим новое значение
 
 }
1
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:29  [ТС]
Спасибо, сейчас попробую разобраться.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
14.12.2013, 01:39
Цитата Сообщение от BlindDespair Посмотреть сообщение
Спасибо, сейчас попробую разобраться.
да че там разбираться это на вид только страшное
например у тебя 16 чисел, они займут 2 байта
тебе нужно достать например 11 ( с учетом что первый бит имеет смешение 0 этот будет иметь смешение 10)
значит он лежит во втором байте
10/8=1 ( первый байт как мы помним имеет смещение 0)
теперь какой это бит по порядку?
10%8 =2
берем 1 и сдвигаем влево на 2
1<<2 (0000 0001)<<2 =0000 0100
вот она маска твоего бита делай с ней что хошь
например достать
arrByte[1]&0x04
и если там лежал 0 то получим 0
0!=0 ложь(то бишь 0) его и вернем
если 1
то получим 0x04
0x04!=0 истина(то бишь1) её и вернем
1
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:59  [ТС]
Извините за, возможно, тупой вопрос, но вот вы используете при записи массива arrByte амперсант и шестнадцатеричную константу, зачем? Что это значит?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.12.2013, 02:02
Посмотрите готовый код у Марка Нельсона (output_code/input_code) в LZW.C
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
14.12.2013, 02:07
Цитата Сообщение от BlindDespair Посмотреть сообщение
амперсант и шестнадцатеричную константу, зачем?
в смысле это
Цитата Сообщение от ValeryS Посмотреть сообщение
res|=(arr[i]&0x01)<<i;
для начала 0x01 и 1 это одно и тоже, просто я привык, если работа со сдвигами или с логикой записывать в шеснадцетеричке, она все ближе к двоичке чем десятичная
второе
arr[i]&0x01 это так сказать подстраховка если в массиве будет число не 0 или 1 то наш сдвиг сделает кашу из результата, вот и выделяю младший бит
ну а потом сдвиг и "ИЛИ" с результатом
0
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 06:09  [ТС]
Завтра буду думать на свежую голову тогда. Спасибо за подсказки. Думаю, возникнут ещё вопросы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2013, 06:09
Помогаю со студенческими работами здесь

Ошибка в алгоритме Хаффмана. С++
Проблемы с реализацией алгоритма Хаффмана. Код по идее должен быть рабочим, но выскакивает такое окно. Не знаю как исправить. Помогите,...

Конвертер - байты в биты
Добрый вечер! Напишите пожалуйста формулу, по которой можно решить данное задание, вводя в edit1 число и по нажатию кнопки выводя...

Дерево в алгоритме Хаффмана, разобраться с записью
Здравствуйте! Хотел бы попросить помощи у вас по построению дерева в статическом алгоритме Хаффмана. есть 2 массива символов и их...

Вектор длин в Алгоритме Хаффмана: Как посчитать
Здравствуйте! Хотелось бы получить консультацию по поводу одного понятия ВЕКТОР ДЛИН в алгоритме Хаффмана... Как посчитать этот вектор...

Пентагон прировнял биты и байты к пулям и бомбам.
«В XXI веке биты и байты могут представлять такую же угрозу, как пули и бомбы. Нажатие на клавишу компьютера в одной стране может привести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru