Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовый поток 
:(
    Опции темы
gpepsi
Дата 19.11.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



есть битовый поток в виде массива байт. Данные находятся в памяти так

11011000-11100011-...
^-----------------------^
|--- 1 бит--------------|------ 16 бит

то есть в первом байте старший бит - первый в битовом потоке.
А младший бит последнего байта - последний бит в потоке
Поток приходит произвольной длинны.

Получается, что данные первых 3 бит = 6

Нужно быстро выкусить набор бит из потока размером не более int64.
Как это сделать ? 
PM MAIL   Вверх
500mhz
Дата 19.11.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



5 раз прочитал -  не понял
у тебя массив в 64 бита максимум
1) сколько бит оттуда нада "выкусить"?
2) откуда "выкусывать" ? с начала массива? с конца?



--------------------

PM MAIL ICQ   Вверх
gpepsi
Дата 19.11.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



Цитата(500mhz @  19.11.2011,  12:56 Найти цитируемый пост)
у тебя массив в 64 бита максимум

нет - десятки байт


Цитата(500mhz @  19.11.2011,  12:56 Найти цитируемый пост)
1) сколько бит оттуда нада "выкусить"?

пока не более int64


Цитата(500mhz @  19.11.2011,  12:56 Найти цитируемый пост)
2) откуда "выкусывать" ? с начала массива? с конца?

с любого места

Добавлено через 8 минут и 39 секунд
ну представьте набор байт в памяти. Для простоты из 3 байт

CF-B2-48

11001111-10110010-01001000

b0 - 1
b1 - 1
b3 - 0
b4 - 0
...
b23- 0


Нужно, например, взять число b7-b12
Это будет 11011 - 27
PM MAIL   Вверх
math64
Дата 19.11.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Код
uint64 getBits(uint8* bits, uint start, uint count) {
  if (count > 64) {
    error();
  }
  if(count == 0)
    return 0;
  uint firstByte = start/8;
  uint lastByte = (start+count-1)/8;
  uint64 res = 0;
  for(uint i = fistByte; i <= lastByte; i++) {
    uint8 byte = bits[i];
    if (i == fistByte) {
      uint bits = start % 8;
      uint8 mask = 0xFF >> bits;
      byte &= mask;
    }
    if (i < lastByte) {
      res <<= 8;
      res |= byte;
    } else {
      uint bits = (start + count) % 8;
      byte >>= 8 - bits;
      res <<= bits;
      res |= byte;
    }
  } 
  return res;
}

но предупреждаю: не тестировал
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1033 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.