WedX - журнал о программировании и компьютерных науках

Существует ли вектор, который может обрабатывать целые числа нестандартной длины в битах?

Я ищу что-то похожее на вектор STL, но могу обрабатывать целые числа длиной, например, 12, 16, 20, 24, 32 и 40 бит. 16-битные и 32-битные случаи прекрасно обрабатываются vector<uint16_t> и vector<uint32_t>, но я не смог найти никакого способа справиться с другими. Обратите внимание, что вся цель этого пути состоит в том, чтобы сэкономить память и пропускную способность, поэтому заполнение не вариант.

Моя структура данных может вывести наиболее значащие биты целых чисел (которые являются int64), поэтому я хочу хранить только младшие разряды. Биты на целое число и количество целых чисел известны во время создания, но не во время компиляции. В идеале биты на целое число могут быть любым значением от 12 до 40, но уровни допустимы из соображений производительности или для работы со структурой, где биты на целое число должны быть установлены во время компиляции.

vector<bool> и dynamic_bitset могут создавать битовые поля, но они ограничен 1-битными целыми числами. Кто-нибудь знает что-то еще там?

05.09.2011

  • Для этого вам нужно будет сделать собственное смещение и маскировку. 05.09.2011
  • @ Хеннинг, у меня есть прототип системы, которая делает именно это, но я стараюсь не изобретать велосипед. Я также заметил, что получить хорошую производительность здесь сложно, поэтому то, что уже настроено, будет очень кстати. 05.09.2011
  • Поскольку вы указали, что целью здесь является сохранение памяти и производительности, я удалил свой первоначальный ответ (поскольку он больше подходил для эзотерических причин, почему это было бы необходимо), но я все еще думаю, что vector<uint64_t>, вероятно, лучшее решение . Тогда вам даже не нужно выводить какие-либо данные, просто сохраните все значение. 05.09.2011
  • @Chad, если я могу использовать 20-битное целое число вместо 64-битного, это означает, что я могу решить проблему, которая в 3 раза больше. Это ОГРОМНОЕ преимущество. 05.09.2011
  • Если в вашей задаче нужны только 20-битные целые числа, то да. Но для этого нужны до 40-битных целых чисел. Если вы не можете разбить проблему на более мелкие части (имеется в виду только 20-битные целые числа в одном наборе задач и только 32-битные целые числа в другом), вы вряд ли найдете решение, подходящее для всех. 05.09.2011

Ответы:


1

В STL его нет.

Я понимаю, что вы беспокоитесь о производительности, и особенно о проблеме с памятью. Однако невыровненные чтения (требующие смещения битов) могут быть медленнее, чем обычные (на границах байтов), поэтому я бы предложил использовать целые байты. Это означает:

  • 12 бит, 16 бит: uint16_t
  • 20 бит, 24 бита: либо 3 uint8_t, либо 1 uint32_t (компромисс скорости/памяти)
  • 32 бита: uint32_t
  • 40 бит: 5 uint8_t, 3 uint16_t или 1 uint64_t

Предполагая, что вы выбираете более простое решение (т. е. всегда переходите к следующему доступному целому числу), вы можете использовать что-то вроде:

boost::variant<
  std::vector<uint16_t>,
  std::vector<uint32_t>,
  std::vector<uint64_t>
>

Это позволит вам выбрать точный vector для использования во время выполнения, исходя из количества байтов, которые вам нужно сохранить.

Если вы хотите сэкономить как можно больше, вам просто нужно добавить std::vector<uint8_t> в список. Но я бы воздержался от этого и, возможно, только «упаковал» 40-битный регистр (в uint16_t), поскольку другие все равно никогда не тратят много памяти ... и я, вероятно, профилировал бы, чтобы проверить обе альтернативы.

Примечание. Вы также можете настроить использование векторной памяти, проверив, что capacity не слишком сильно превышает size.

05.09.2011
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]