пяти битная система перевод в восьми битную и наоборот
- Войдите на сайт для отправки комментариев
Пт, 15/05/2015 - 18:14
Всем привет .
задача : обработать данные от некоего устройства которое шлет пакет из 25 байт (8*25=200 бит) но в этих 200 битах 40 слов по 5 бит на каждое , нужно извлеч инфу и поместить в байтовый массив размерностью 40.
как это зделать через цикл и побитное сравнение я знаю , но ето слишком медленно работает , может есть более простое и правильное решение
Достаточно абстрактная задача, неизвестно в каком виде и с какого интерфейса получаем данные, есть вариант на лету преобразовывать, а не собирать данные, а потом их преобразовывать.
А если рассматривать задачу как массив из 25 байтов преобразовать в другой массив в 40 байтов, то это совсем другая задача. Плюс "слишком медленно" тоже относительно. Можно выложить скетч, посмотрим, может что то не оптимально написано? Фраза "побитное сравнение" навевает на что то странное. При преобразовании нет нужды сравнивать, навскидку, здесь нужно только считывать, сдвигать, очищать по маске и складывать, строчек 7-10.
Угу, совершенно верно. << >> рулят
тестовый скетч выглядит так и на 16мегагерцовой уне отрабатывает конвертирование за 1960 микросек
с удовольствием приму в дар код который отработает в два раза быстрее
с удовольствием приму в дар код который отработает в два раза быстрее
ой. если так важно время, может для начала прекратить каждый раз сериал инициализировать перед выводом? достаточно это сделать один раз.
и эт, даром, за амбаром!
Ну я так и подозревал. У Вас 200 циклов, когда можно обойтись примерно 25-ю. Маски, сдвиги, логические операции. Считали первый байт. 5 бит из него сохранили, 3 бита оставили в накопителе. Считали второй байт, из него взяли 2 бита и с 3 битами из накопителя получили 5 бит, сохранили. Из оставшихся 6 бит 5 сохранили, 1 бит в накопитель. И т.д. это один из простых алгоритмов, хотя у Вас ещё проще, потому и медленней. Хотя и его можно оптимизировать, кстати. И да, не принимайте в дар, получите дар самостоятельно, алгоритм я Вам подсказал.
UPD: ещё можно сделать по Вашему принципу, но за 40 циклов, каждый раз собирая биты из входного массива. Что оптимальней, надо пробовать.
UPD2: Результат 52 микросекунды - это результат по третьему алгоритму, в котором всего 5 циклов.
to puhlyaviy
Serial
.begin(9600); выполняется один раз , так как не находится в теле цикла
И научитесь отделять пробелами "слова" и "предложения" и не ставить пробелы там где они не нужны.
У меня получилось 52 мкс видимо за счёт оптимизатор, плюс я использовал переменные и не читал из массива по несколько раз.
Запускал на Леонардо.
Да, АрдуиноИде 1.6.4 это тоже может быть важно.
ради интереса прогнал свой код и код от maksim на DUE результат 126 / 6