Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
#1

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

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

Пишу программу на С, в которой нужно реализовать метод кодирования Хаффмана. Код не буду прикладывать, так как в нём в принципе для меня всё понятно. В общем читаю я из текстового файла информацию, проходит этап кодировки, хоть и дерево неправильно строится, но меня этот вопрос пока не волнует. Меня вот что волнует: записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит, что приводит к тому, что бинарный файл, который должен быть сжатым вроде как, становится больше текстового файла, который я кодирую. Так вот вопрос: как сделать так, чтобы 0 и 1 принимались в бинарном файле как 1 бит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Биты и байты в алгоритме Хаффмана (C++):

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

Биты, байты. Циклически сдвинуть на 4 разряда вправо четное число. - C++
В массиве Х чисел типа short обработать каждое число согласно условиям: Циклически сдвинуть на 4 разряда вправо четное число....

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат - C++
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат.

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... - C++
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

Ошибка в алгоритме - C++
Неправильно работает программа есть сетка (координаты x - в векторе A y - в векторе B) надо из известных точек проложить кратчайший...

Ошибка в алгоритме - C++
Помогите найти ошибку в алгоритме. Алгоритм должен сортировать строки. void SortArrayString(string *&arr, int n, char arr2) /* arr...

9
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,190
14.12.2013, 00:59 #2
Цитата Сообщение от BlindDespair Посмотреть сообщение
записываю я код из 0 и 1 в бинарный файл, но в нем 0 и 1 почему-то считаются как 1 байт, то есть как символы из ASCII таблицы, а не как 1 бит,
наверно потому что в Си минимальная единица char, она же байт
ни о каких битах он не знает,хотя есть такие диалекты( для микроконтроллеров) которые могут с битами работать, но это уже экзотика
так что упаковывай 8 бит в один unsigned char, или смирись с тем что тебе под 0 и 1 выделяется целый байт
0
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:01  [ТС] #3
А можно поподробнее по поводу 8 бит в unsignet char?
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,190
14.12.2013, 01:26 #4
Цитата Сообщение от 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
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:29  [ТС] #5
Спасибо, сейчас попробую разобраться.
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,190
14.12.2013, 01:39 #6
Цитата Сообщение от 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
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 01:59  [ТС] #7
Извините за, возможно, тупой вопрос, но вот вы используете при записи массива arrByte амперсант и шестнадцатеричную константу, зачем? Что это значит?
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
14.12.2013, 02:02 #8
Посмотрите готовый код у Марка Нельсона (output_code/input_code) в LZW.C
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,190
14.12.2013, 02:07 #9
Цитата Сообщение от BlindDespair Посмотреть сообщение
амперсант и шестнадцатеричную константу, зачем?
в смысле это
Цитата Сообщение от ValeryS Посмотреть сообщение
res|=(arr[i]&0x01)<<i;
для начала 0x01 и 1 это одно и тоже, просто я привык, если работа со сдвигами или с логикой записывать в шеснадцетеричке, она все ближе к двоичке чем десятичная
второе
arr[i]&0x01 это так сказать подстраховка если в массиве будет число не 0 или 1 то наш сдвиг сделает кашу из результата, вот и выделяю младший бит
ну а потом сдвиг и "ИЛИ" с результатом
0
BlindDespair
0 / 0 / 0
Регистрация: 07.12.2013
Сообщений: 18
14.12.2013, 06:09  [ТС] #10
Завтра буду думать на свежую голову тогда. Спасибо за подсказки. Думаю, возникнут ещё вопросы.
0
14.12.2013, 06:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2013, 06:09
Привет! Вот еще темы с ответами:

биты - C++
помогите пожалуйста написать программу которая переведет натуральное число в двоичною систему исчесления и выведет на экран

Ошибка в алгоритме со строками - C++
По условию задачи, вводится строка со словами, необходимо вывести на экран слово, в котором наименьшее число повторяющихся букв. Т.е....

Ошибка в алгоритме сортировки - C++
Пожалуйста укажите мне ошибку в реализуемом мною алгоритме сортировки #include &lt;iostream&gt; using namespace std; int main() ...

Утечка памяти в алгоритме - C++
Где ошибка в этом алгоритме? как вывести произведение for (int i = 999; i &gt; 99; --i) { for (int j = 999; j &gt; 99; --j) { ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru