Как отобразить от 10 до 6 бит в C ++ (максимально эффективно)? - PullRequest
1 голос
/ 29 сентября 2011

Так что я функционально знаю, чего бы я хотел, но я просто не знаю, как заставить компьютер делать это ... в C ++ ...

Я бы хотел реализовать C ++функция, которая отображает 10-битную последовательность в 6-битную последовательность.

Не имеет значения, что означают биты прямо сейчас ... Есть 2 ^ 10 = 1024 возможных входов.Есть 2 ^ 6 = 64 разных выходов.Вероятно, много моделей.Очевидно, много моделей.Но это сложно.Это известное отображение, просто сложное отображение.

Вывод - только одна из 64 возможностей.Может быть, они все не привыкли.Они, вероятно, не будут.Но предположим, что это так.

Прямо сейчас я думаю о четырехкратном вложенном операторе switch, который просто заботится о каждом из 1024 случаев и заботится о внутреннем бизнесе, присваивая соответствующие значения любому указателю на любую структуру, которую яперешел к этой функции.Это кажется наивным и медленным.Не то чтобы я это реализовал, но поэтому я хочу сначала спросить вас.

Эта базовая функция (отображение) должна будет выполняться на каждом узле оператора, часто более одного раза, для стольких операторов, сколько этоСистема желает поддержать.Я спрашиваю вас, как я могу максимально эффективно отобразить 10 битов в 6 битов в C ++?

Я знаю, что такое отображение, я знаю, какие входы 10 битов идут с каким выходом 6 битов ...Я мог бы полностью жестко закодировать это ... как-нибудь?Мульти-переключатель так безобразен.Как я могу отобразить свои 10 бит на 6 бит ?!Нейронная сеть?Маффин памяти?Что бы вы сделали?

Примечание для себя: Так вот почему я не фанат таблицы поиска.Давайте предположим, что все входные данные одинаково вероятны (конечно, это не так, и их можно было бы упорядочить более эффективно, но все же), тогда для извлечения выходных значений потребуется в среднем 512 разрядов памяти массива ... Кажется, что если вы сделаете(глобальное, почему бы и нет) двоичное дерево глубиной 10 уровней, вы покрываете 1024 входа и можете получить выходные данные в среднем всего за 10 шагов ... и, возможно, меньше, если есть хорошие шаблоны ... с учетом детерминированной функции, котораязапускать так часто, как лучше всего извлечь известные выходные данные из известных входных данных?

Ответы [ 4 ]

6 голосов
/ 29 сентября 2011

Я бы использовал таблицу поиска из 1024 элементов.Настолько жесткий код, что и просто доступ к нему по индексу.

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

4 голосов
/ 29 сентября 2011

Зависит от вашего определения эффективности.

  1. Экономия времени: справочная таблица.
  2. Экономия пространства: используйте карту Карно.
2 голосов
/ 29 сентября 2011

Используйте справочную таблицу размером 1024.

0 голосов
/ 29 сентября 2011

Если вам нужно сопоставить некоторые конкретные 6-битные значения, используйте таблицу подстановки размер 64 (не 1024!) После деления на 16. Это будет соответствоватькешировать проще, чем 16-кратную избыточную таблицу с 1024 записями (и 2 дополнительных цикла для правого сдвига значительно превышают стоимость возможного промаха кеша).

В противном случае, если простое последовательное отображениехорошо, просто делим на 16.

1024/64 = 16, поэтому деление на 16 (сдвиг вправо с включенной оптимизацией компилятора) соответствует 6 битам (последовательно).Это не может быть более эффективным, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...