| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > биты в байты и обратно %) |
| Автор: boostcoder 26.5.2012, 23:30 |
| всем привет! снова мне повстречалась задача с битами прошу помощи. имеем класс, описывающий битовое множество(http://qt-project.org/doc/qt-4.8/qbitarray.html) нужно это дело поместить в массив байт, и обратно. я не очень-то понимаю как мне итерироваться по битам каждого байта массива. спасибо. |
| Автор: boostcoder 26.5.2012, 23:48 |
| в общем, нагуглил два решения: http://stackoverflow.com/questions/8776261/qbitarray-to-qbytearray http://stackoverflow.com/questions/5251403/binary-serialization-of-stdbitset и сразу понял как реализовать задачу но решение для QBitArray что-то мне кажется дико оверхедным... у кого-то есть предложения по оптимизации? |
| Автор: boostcoder 27.5.2012, 00:22 |
о, спасибо ладно, вопрос закрываю. |
| Автор: volatile 27.5.2012, 00:29 | ||
Кстати там ниже, это испривили, (только что посмотрел)
Но все равно, мой вариант, более точный: |
| Автор: mes 27.5.2012, 00:52 |
написать Qt, зато что лишила доступа к внутренней прослойке |
| Автор: boostcoder 27.5.2012, 01:04 |
| mes, а ведь в стандартной реализации этого тоже нет: http://en.cppreference.com/w/cpp/utility/bitset Добавлено через 2 минуты и 50 секунд и в http://www.boost.org/doc/libs/1_49_0/libs/dynamic_bitset/dynamic_bitset.html этого тоже нет, почему-то. |
| Автор: mes 27.5.2012, 09:02 | ||
ага, там ограничились u(l)long'ом... сам не так давно возмущался их поведением Добавлено через 3 минуты и 20 секунд там хоть to_block_range есть |
| Автор: boostcoder 27.5.2012, 12:19 |
да, точно Вы про то, что внутреннее хранилище состоит из массива long`ов? |
| Автор: mes 27.5.2012, 12:45 | ||
про возвращение набора битов как u(l)long, размера которого увы не всегда хватает..а о массиве они почему то не подумали.. |
| Автор: boostcoder 27.5.2012, 13:00 |
| ааа, ну да. но раз уж все известные мне реализации поступают так же, возможно есть на то причина? |
| Автор: mes 27.5.2012, 13:24 | ||
как выяснили не все.. а причина думаю только одна, непонятка зачем при работе с битами массив байтов хранилища.. |
| Автор: boostcoder 27.5.2012, 13:27 |
| ясно) |
| Автор: borisbn 27.5.2012, 13:56 |
| у всех этих "стандартных" битсетов (что std, что boost, что Qt) есть один недостаток: они складывают биты в байте начиная с младшего. Например, последовательность 10101100 будет равна 0x35, а многие библиотеки (да почти все) требуют, чтобы биты складывались, начиная со старшего бита. Т.о. приведённая последовательность должна быть равна 0xAC, а не 0x35. Так что советую реализовать свой битсет (можно без блекджека))). Тем более, что это - совсем нетрудно |
| Автор: hawk3500 29.5.2012, 16:45 | ||
| Занимаюсь ЦОС. На ПК более быстрого и прозрачного решения чем ниже описанное не нашёл. Да не экономично по отношению к памяти , зато быстро и прозрачно.
|
| Автор: borisbn 29.5.2012, 17:27 |
| ох, не думаю, что такая адресация это думаю, эффективней будет сделать один линейный массив и вычислять индекс как-нибудь так IN_MASS[OUT_POS] * 8 + 0 + IN_MASS[OUT_POS+1] * 8 + 1 и т.д. |
| Автор: hawk3500 29.5.2012, 18:47 |
| Надо попробовать и протестировать.Завтра посмотрю на скорость. Ну вообще мне не совсем ясно почему такая многомерная выборка будет медленнее чем Ваш пример. Надо подумать...если получится что нибудь побыстрее будет весьма хорошо. |
| Автор: hawk3500 30.5.2012, 12:22 |
| Проверил несколько вариантов, в том числе и приведённый Вами вариант...но пока описанный мной выше вариант быстрей остальных...так что проблем с таким чтением из памяти я не увидел. |
| Автор: borisbn 30.5.2012, 13:01 |
| hawk3500, ну... я и не утверждал категорично. Просто где-то читал, что двойная и тем более 8-ная индексация гораздо дольше линейной. В Вашем примере я вижу несколько моментов - компилятор мог соптимизировать , убрав двойную индексацию - Ваш пример - вообще не то, о чём я читал. Вот если бы это был указатель на указатель ( int ********PARSE; ), то тогда, возможно, моё замечание и имело бы смысл. Я рад, тому, что Ваш вариант самый быстрый, а также тому, что его можно нахаляву взять в этой теме (я ж надеюсь у Вас не GPL, а MIT |
| Автор: hawk3500 1.6.2012, 12:46 |
| Да, компилятор и вправду у меня оптимизирует. |