2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
||||||
1 | ||||||
Быстрый перевод байта в вектор битов29.07.2011, 18:42. Показов 6745. Ответов 48
Метки нет (Все метки)
Всем привет. Есть тут интересная задачка: перевести байт в вектор битов, да побыстрее.
Я реализовал это дело через таблицу. Кто знает способ лучше ?
0
|
29.07.2011, 18:42 | |
Ответы с готовыми решениями:
48
Перевод таблицы битов и времени в последовательность битов arduino Вектор битов и машинные слова Перевод байта в знаковый формат Самый быстрый способ дополнить вектор массивом |
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
29.07.2011, 19:18 | 2 | |||||
а если развернуть цикл?
Добавлено через 8 минут
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
29.07.2011, 23:58 [ТС] | 3 |
Надо будет проверить на время выполнения.
0
|
Модератор
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
|
||||||
30.07.2011, 00:22 | 4 | |||||
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
30.07.2011, 01:10 [ТС] | 5 |
memcpy() использовать нельзя. од будет запускаться на ARM архитектуре и могут быть грабли с BigEndian / LittleEndian
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
||||||
30.07.2011, 09:46 | 6 | |||||
Здравствуйте! Есть проще вариант. В с++ есть библиотечный тип bitset, который позволяет удобно работать с наборами битов. Приведу простой пример вывода на экран значения битов. Думаю, перевести в вектор не составит труда (если нужно)
0
|
alex_x_x
|
30.07.2011, 14:05
#7
|
Не по теме: TheAthlete, эт понятно, но автор чтото сетовал на скорость
0
|
30.07.2011, 16:08 | 8 |
Что ты подразумеваешь под "лучше"?
Вариант со статической инициализацией векторов и дальнейшего использования нужного вектора - это максимально быстрый способ, очевидным минусом котрого является расход памяти. Точно так 30 лет назад в игрушках строились таблицы синусов и косинусов, чтобы на медленных процессорах не терять время на вычисление.
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
30.07.2011, 20:56 [ТС] | 9 |
Под "лучше" я подразумеваю "быстрее". Время выполнения кода очень критично.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
30.07.2011, 21:56 | 10 |
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
30.07.2011, 22:24 [ТС] | 11 |
Да. В программе нужны операции над битами (битстаффинг, скремблинг). Для хранения битов используются вектора байтов.
0
|
30.07.2011, 23:23 | 12 |
Если критично, мне кажется это лучше на си или на ассемблере писать. Для битовых операций типа срамбла на некоторых процессорах есть операции, хз как на Arm'е
0
|
30.07.2011, 23:31 | 13 | |||||
вот так получилось быстрее таблицы
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
31.07.2011, 01:24 [ТС] | 15 |
А почему коряво? Заносим в вектор значение по заданному индексу из массива. push_back() уже вычисленное значение.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
31.07.2011, 07:14 | 16 | |||||
Максимальная эффективность будет только у таблицы менее 256 значений, остальные уже менее эффективны будут даже в асме.
Поэтому вот код:
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
31.07.2011, 10:00 | 17 |
Тогда не вектор, а массив.
Через таблицу - самое быстрое. Хотя можно не массив из 8 элементов, а константы-строки "00000001", "00000010"... И.т.д. Меньше памяти.
0
|
31.07.2011, 10:46 | 18 |
В таблице у тебя должны быть не байты, а уже готовые вектора, которые нужно просто скопировать. А ещё лучше - взять ссылку на готовый вектор (read-only, естественно), тогда это будет сравнимо по скорости с индексацией одного элемента скалярного массива
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
31.07.2011, 17:51 [ТС] | 19 |
Хм. То-есть, каждый раз при вызове этой функции будет создаваться 256 векторов, в каждый из них будут push_back() соответствующие биты, потом эти вектора заноситься в массив, а потом уже возвращаться в качестве преобразованного значения?
0
|
31.07.2011, 18:30 | 20 |
Нет. В самом начале программы у тебя будет инициализация таблицы. Ты делаешь 256 раз по 8 push_back'ов. А в том месте, где тебе нужно сконвертировать байт в вектор, ты просто копируешь соотвествующий вектор из таблицы
0
|
31.07.2011, 18:30 | |
31.07.2011, 18:30 | |
Помогаю со студенческими работами здесь
20
как заполнить вектор векторов прямо в программе (самый быстрый метод) Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B... Чтение байта в режиме SPI 9 битов Запись битов ячейки памяти (2 байта) в обратном порядке (вставка в программе на С++) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |