2015-07-27 4 views
2

Мне нужен симметричный оператор modulo для сбалансированной системы тернарных чисел; Его можно использовать для расчета наименьшей значимой суммы триты (тройная функция добавления); Моя реализация кажется неэффективной, она использует 2 modulo (%) операторов и несколько операций добавления/подстановки. Вот мой код (он работает правильно):Как реализовать симметричную модульную операцию?

int symmetric_modulo(int x, int fullRadix = 3) { 
    int halfRadix = fullRadix/2; 
    int divRemainder = x % fullRadix; 
    return (divRemainder + halfRadix + fullRadix) % fullRadix - halfRadix; 
} 

x может находиться в диапазоне [-3..3]; и результат должен быть -1, 0 или 1; Можете ли вы предложить более эффективный код для этого?

+0

Если у вас есть ограниченное и известный диапазон для обоих операндов, простая таблица поиска будет делать, если вы не удовлетворены эффективностью (но это выглядит нормально для меня). –

+0

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

+2

Вы знаете, что код выполняется из той же ОЗУ, из которого извлекаются данные, справа (если мы не говорим о какой-либо встроенной платформе)? Поэтому, если скорость памяти связана с вами, она также должна касаться кода. Также запомните тайники. Но, в любом случае, для небольших LUT они могут быть реализованы с корпусом коммутатора, а не с массивами. –

ответ

2

int divRemainder = x % fullRadix; необходимо только, если x + halfRadix + fullRadix переполнение или результат отрицательный.

Если нет переполнения/отрицательный результат возможен как в x may be in range [-3..3]; Упрощению:

int symmetric_modulo(int x, int fullRadix) { 
    int halfRadix = fullRadix/2; 
    return (x + halfRadix + fullRadix) % fullRadix - halfRadix; 
} 
Смежные вопросы