Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с битами  (Прочитано 16366 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Duke
Гость
« : 07-03-2005 19:26 » 

Например, есть некоторая совокупность символов, каждый из которых кодируется двоичным числом с длиной кода не кратной длине байта - от 1 до 10 бит, т.е. а1=1, а2=101 и т.п.
Вопрос: как записывать и считывать подобные коды из файла? И как вообще работать с такими кодами в самой программе?
Ответ, пожалуйста, дайте на Delphi или асемблере, т.к. прога на Delphi и переделать её невозможно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 07-03-2005 19:42 » 

Duke,  У тебя отводится на каждую комбинацию бит строгое количество знаков или длина битового слова может меняться? т.е. ты должен записывать только по 10 бит, или ты первые нули выбрасываеш?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 07-03-2005 20:00 » 

есть такое понятие как бинарные операции.
Shift Left, Shift right  и т.д.

Структура файла из описания не ясна.
Линейный файл где
00101000101001001 - запись и заранее неизвестно сколько какой код занимает место не читабелен в принципе - должна быть либо заранее известна постоянная длина, скажем 10 бит - максимальная.
Тогда можно записывать код 0000000101 и 0101101101 без разделения..
Либо иметь заранее определенную последовательность которая кодом символа быть не может - например
101010011111
Где 101 код первого символа
0100 разделитель
11111 второй симовл и т.д.

Имея и тот и другой вариант работа с битами будет заключаться в следующем:
1. Считать все данные.
2. Если запись линейна, то....
а) считываем байт и считаем сколько битов считано. Если считано меньше - т.е. 8 бит дестибитного числа, то задвигаем его влево на остаток - в данном случае 2 бита.
в) читаем следующий байт.
Вычленяем с помощью & бинарного сложения два верхних бита и так же с помощью "или" операции заталкиваем их в два нужных битпа первого числа...
Естественно, что держать нао число в формате в котором число бит в числе превысит макс возможную длину полученного кода - в примере - это два байта.

При наличии разделительных символов - задача усложняется необходимостью отделения разделителей  от данных.

Если ты файл создаешь сам, то я бы предпочел избыток данных чем разделитель... Найти точный не встречающийся нигде разделитель сложно.
Записан

А птичку нашу прошу не обижать!!!
Alf
Гость
« Ответ #3 : 07-03-2005 21:58 » 

Например, есть некоторая совокупность символов, каждый из которых кодируется двоичным числом с длиной кода не кратной длине байта - от 1 до 10 бит, т.е. а1=1, а2=101 и т.п.

А сколько всего может быть различных символов?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 08-03-2005 18:17 » 

Duke, а речь часом не о коде Хафмана?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Duke
Гость
« Ответ #5 : 08-03-2005 18:46 » 

>Duke, а речь часом не о коде Хафмана?

Почти, только длина кода зависит не от вероятности появления символа, а несколько от других параметров. Так что, на примере кода Хафмана можно.
Каждый символ кодируется строго определённым кодом.
Избыточность бы не хотелось вносить.
« Последнее редактирование: 08-03-2005 19:02 от Duke » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 08-03-2005 19:34 » 

Если все так совпадает, таки в чем проблема? Как считать N бит?
Хотелось бы точно понять, что тебе надо.
« Последнее редактирование: 08-03-2005 20:06 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Duke
Гость
« Ответ #7 : 09-03-2005 06:07 » 

Если все так совпадает, таки в чем проблема? Как считать N бит?
Хотелось бы точно понять, что тебе надо.
Я быть может спрашиваю для кого-то элементарные вещи, но я с программированием связан постольку-поскольку.
Да проблема в том, как считать N bit. Впрочем, вроде из топика Грома (спасибо) я понял как это сделать.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 09-03-2005 06:44 » 

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

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 09-03-2005 09:17 » 

Код:
int get_bit(char * buf, int bit_number)
{
  if(bit_numbaer & 7)
    return buf[bit_number >> 8]  & (2 << bit_number);
  else
    return buf[bit_number >> 8]  & 1;
}
Код Хафмана: 0, 10, 110, 1110, ..., 1...1.

Что делать: сосчитать число последовательных единиц до ноля, но не более N (максимальная длина кода).
На выходе: число 0...N.
« Последнее редактирование: 09-03-2005 14:39 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 09-03-2005 09:22 » 

RXL - исходя из примера я все же скажу, что формально buf реально один элемент его все равно 8 бит и читать в него из файла все равно только по 8 бит можно Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 09-03-2005 14:46 » 

Не понял - что значит "формально buf реально один элемент"?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #12 : 10-03-2005 09:24 » 

РЕально минимально возможное считываемое колличество бит программой из физического фалйа 8 = 1 байт.
Меньше типа данных нет.
В вопросе было как считать ...
В твоей функции ты тоже оперируешь с buf типа char * что означает 8 бит.
Отсюда и решил упомянуть, что изически сичтываются в память и в памяти содержатся единицы данных 1 байт = 8 бит, просто мы можем алгоритмизруя создать битовые обращения, маски и передачу 1-го бита...
НО НЕ СЧИТЫВАНИЕ.

Вот что имелось ввиду.
Записан

А птичку нашу прошу не обижать!!!
Alf
Гость
« Ответ #13 : 10-03-2005 09:31 » 

Читать побитово - не проблема, достаточно буфера на байт (либо слово). Читаем же дисковые файлы посимвольно, хотя на самом деле обмен с диском посекторный. Буфер эти тонкости спрячет.

Другое дело - надо ли? На вопрос о символьном наборе автор упорно не желает отвечать, а без этого непонятно.
Записан
OSokin
Гость
« Ответ #14 : 15-05-2005 12:45 » 

Считать по ( bitscount div 8 )+1 байт и побайтно пересчитывать биты... Лично я делаю так (на Делфи): делаю массив на 8 boolean'ов, проверяю, больше ли этот байт 2*n степени. Если да, но вычитаю из него 2*n и ставлю соотв. бит true, если нет - false.
« Последнее редактирование: 20-12-2007 21:10 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines