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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевернуть байт, Наизнанку:) 
:(
    Опции темы
azesmcar
Дата 23.12.2004, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Тьфу, мне только байт нужно...с WORD и DWORD там еще проблемы есть...у них кроме битов еще и байты наоборот записаны..
PM   Вверх
Mad
Дата 23.12.2004, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Кстати макросы это и делают (побайтный обмен а не побитный) smile
Добавлено @ 13:51
Проверь точнее. Если (например) у тебя данные передаються через COM порт, то побитный переворот , вроде, сам UART выполнит.


--------------------
user posted image
PM MAIL   Вверх
azesmcar
Дата 23.12.2004, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Не совсем, данные читаются из файла...
В принципе их тоже можно скопировать из windows.h

Ладно, давай я всю задачу приведу если кто более разумное решение подскажет буду очень благодарен...я пока другого не вижу...

Нужен класс, интерфейс для чтения битов...
В конечном варианте все сводится к одной функции...

ReadBits(const unsigned char* p, int nfrom, int ncnt)
{

}
приблизительно то же самое что и substr только для битов...
Я все это написал...работает прекрасно, заставляет грустить только перспектива этого кода на linux-е...решал задачу в нескольких вариантах...

Первый: Есть функция ReadBit() читать всегда один бит, тот на который указывает позиция...
ReadBits функция в цикле вызывает ReadBit()
Код

int nRet = 0;
for (int i = 0; i < nBitCount; ++i)
{
  nRet <<= 1;
  nRet |= ReadBit();
}
return nRet;

[b]Второй: [/b] Знаю с какой позиции читать, вычисляю номер байта и дальше уже смещениями...
влево, потом вправо...получаю ожидаемый результат..

Первый работает медленно, и не работает на линуксе, второй работает на линуксе, не работает на виндах...

Будут предложения??
PM   Вверх
Mad
Дата 23.12.2004, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(azesmcar @ 23.12.2004, 13:03)
Первый работает медленно, и не работает на линуксе, второй работает на линуксе, не работает на виндах...

Непонятно smile причем тут ось ?

Но подобная задача решается в gzip (выборка битовых последовательностей переменной длинны из потока) посмотри реализацию (в линухе поставляються сорци).



--------------------
user posted image
PM MAIL   Вверх
azesmcar
Дата 23.12.2004, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Кстати, говоря на линуксе я имею ввиду на проце моторола...
Добавлено @ 14:20
В gzip??? щас, посмотрю...Хотя вроде уже все...

с переворачиванием получилось...
Спасибо за помощь...но если будут еще предложения с удовольствием выслушаю..

PM   Вверх
Guest
Дата 24.12.2004, 22:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

// __было 1101100011100010
// _стало 0100011100011011
void reverse_bit_array( void *array, unsigned max_size ){
  unsigned char *ptr = (unsigned char *)array;

  int i = max_size*8-1;  // начинаем с конца массива
  for(;!(ptr[ i>>3 ] & 1<<(i&0x7)) && i>=0;i-- ); // находим первую единицу.

  for( int j=i;j>i>>1;j-- ){ // цикл от первой ед. до середины того что осталось
    #define hi_char  ( ptr[ j>>3 ] )
    #define low_char ( ptr[ (i-j)>>3 ] )

    #define hi_mask  ( 1<<(j&0x7) )
    #define low_mask  ( 1<<((i-j)&0x7) )

    bool hi_bit  = ( hi_char & hi_mask );  // старший бит
    bool low_bit = ( low_char & low_mask ); // соответствующий старшему биту - младший( зеркальный )
    if( hi_bit != low_bit ){ // поможем компу избавиться лишних вычислений
      // меняем биты
      hi_char = low_bit ? hi_char | hi_mask : hi_char & ~hi_mask;
      low_char = hi_bit ? low_char | low_mask : low_char & ~low_mask;
    }
  }
}

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

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

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

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

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


 




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


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

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