2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
||||||
1 | ||||||
Быстрый перевод байта в вектор битов29.07.2011, 18:42. Показов 6750. Ответов 48
Метки нет (Все метки)
Всем привет. Есть тут интересная задачка: перевести байт в вектор битов, да побыстрее.
Я реализовал это дело через таблицу. Кто знает способ лучше ?
0
|
29.07.2011, 18:42 | |
Ответы с готовыми решениями:
48
Перевод таблицы битов и времени в последовательность битов arduino Вектор битов и машинные слова Перевод байта в знаковый формат Самый быстрый способ дополнить вектор массивом |
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
||||||
31.07.2011, 18:54 | 21 | |||||
Я бы при таком подходе вообще как-то так сделал:
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
31.07.2011, 20:48 | 22 |
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
|||||||||||
31.07.2011, 21:02 | 23 | ||||||||||
Посмотрел bitset, действительно работает медленнее. чем даже ваше старое решение.
Я думаю, если нужно самое быстрое решение, то на ум приходят следующие варианты 1) использование массивов вместо векторов и при этом создание глобального массива и сразу его инициализировать, примерно так:
это вероятно будет самый простой и быстрый вариант. Т.к. вам нужно использовать вектора, то можно использовать подобный вариант:
Ну, и третий вариант, тоже с созданием глобальной переменной, но до этого создается функция, которая все предварительно рассчитует (в случае если нет поддержки стандарта c++0x или не планируется его использовать) значение вектора и значение этой функции возвращается в глобальный вектор
0
|
2 / 2 / 1
Регистрация: 13.08.2008
Сообщений: 84
|
|
31.07.2011, 21:56 [ТС] | 24 |
Хм. Я так понимаю прирост будет если многократно использовать вначале созданный массив векторов. А для единичного преобразования остальное будет быстрее? У меня сейчас в программе эта функция конвертора является статическим методом класса B. И вызывается в классе A раз 5. После чего класс A уничтожается. Вижу что есть смысл в классе A создать экземпляр класса B, проинициализировать таблицу векторов и работать с этой таблицей.
А в данном варианте программы, который приведен у меня выше, при каждом вызове статического метода этот массив заново создается ведь? Инициализация массива в теле класса B за пределами конструктора не увенчалась успехом. Даже если использовать static const Добавлено через 48 минут А где собственно тип данных в векторе? Или это так по стандарту c++0x можно?
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
31.07.2011, 22:12 | 25 |
А Вы вот эту мою програмку откомпилируйте, запустите (с маленькими числами она работает) и сами всё поймёте...
1
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
31.07.2011, 22:29 | 26 |
easybudda, все, понял
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
31.07.2011, 22:50 | 27 |
alex_x_x, весь профит от такого подхода в том, что работать с массивом чисел даже типа long long по крайней мере в программе на С было бы легче и быстрее, чем с массивом массивов (я так понимаю - там не одно число должно обрабатываться)... Сами же числа типа unsigned long long используются просто, как массив unsigned char[8]
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
||||||
01.08.2011, 08:25 | 29 | |||||
const vector< vector<size_t> > CharBitsTable - это двумерный вложенный вектор. По сути вектор векторов. Допустим внешний вектор содержит 256 значений, и каждый внутренний содержит соответствующий ему набор из битов.
Что-бы получить вектор, который содержит нужное значение (из 256), нужно обратиться как к массиву (используя индексацию):
Насчет c++0x: данная конструкция (вложенные вектора) может работать и в старом стандарте, а вот инициализация вектора как в массиве (с помощью фигурных скобок, а не используя тучу push_back) появилась только в стандарте c++0x
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
|
01.08.2011, 11:32 | 31 |
но если критична скорость, то лучше статическую, т.е. как я уже писал, создать глобальную переменную и уже в коде ее использовать. (не до конца понял, что выливается в динамическую инициализацию). Если создавать с помощью функции-члена класса или функции, то динамически будет создаваться, т.е. при каждом запуске функции будет генериться заново код
0
|
01.08.2011, 14:36 | 32 |
Выливается то, что я процитировал. Т.е. в исходнике ты пишешь как буд-то это статическая инициализация (т.е. память под вектора раписывается на этапе компиляции), но компилятор реально сгенерирует динамическую инициализацию (т.е. неведомо для пользователя сгенерируется код с push_back'ами, который вызовется перед main'ом). Это так или не так?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
01.08.2011, 15:06 | 33 |
Если это не прописано в стандарте, то может быть всё что угодно.
Если рассуждать логически, то есть два варианта: 1. неявные пушбэки 2. неявный инсерт При статической инициализации деструктор вектора не правильно отработает, так что это не реально. Или в него добавлять флажок о его "статичности".
0
|
01.08.2011, 15:14 | 34 |
Поскольку я не знаю стадарта, никогда не работал с указнной версией Си++, имею недостаточный опыт работы на Си++, чтобы понять, как вообще возможно сделать статическую инициализацию вектора, потому и задал вопрос. И у меня было дикое подозрение, что укзанная конструкция, которая появилась в стандарте c++0x - это всего лишь более удобная форма записи, которая на самом деле приведёт к тому же самому коду. Т.е. выигрыша в скорости оно не даст
Разработчики Си++ всё-таки народ ушлый и могли добавить в язык очередные нанорасширения, правда всё равно не представляю, как это можно было бы сделать на уровне статической инициаизации
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
01.08.2011, 15:25 | 35 | |||||
Та же печалька. Ещё лет 3-5 можно сильно по этому поводу не напрягаться. Пока всё утрясётся, пока поддержка во всех компиляторах появится...
Типо такого:
0
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
||||||
01.08.2011, 15:39 | 36 | |||||
Ничего там не будет преобразововаться, просто вызовется такой конструктор:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
01.08.2011, 15:47 | 37 |
Найди два отличия.)))
и По сути одно и то же. Но мы же говорим не о списке инициализации, а о Статической инициализации, а это две большие разницы. Добавлено через 18 секунд В смысле десять...
0
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
01.08.2011, 15:50 | 38 |
Deviaphan, Просто я подумал, что этим
ты хотел сказать, что вызоветься именно конструктор для этой записи , а не для этой
0
|
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
|
||||||
01.08.2011, 16:39 | 39 | |||||
хотя если развернуть еще дальше, т.е. посмотреть, что делает функция _M_range_initialize, то получим push_back:
0
|
01.08.2011, 16:44 | 40 |
Ни то, ни другое, ни ниже приведённые примеры - это НЕ статическая инициализация, потому что она выполняется НЕ compile-time, а run-time. Я потом и говорил, что не понимаю, как это можно сделать статически.
0
|
01.08.2011, 16:44 | |
01.08.2011, 16:44 | |
Помогаю со студенческими работами здесь
40
как заполнить вектор векторов прямо в программе (самый быстрый метод) Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B... Чтение байта в режиме SPI 9 битов Запись битов ячейки памяти (2 байта) в обратном порядке (вставка в программе на С++) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |