В достаточно современном процессе деление на 15 не должно быть таким ужасным. Руководство по оптимизации AMD определяет его на основе частного (значение, которое делится), и оно занимает 8-битную позицию старшего бита частного. Итак, если ваши числа имеют 63-й бит, вы получите 71 цикл - что, конечно, довольно длинная инструкция. Но для 32-битного числа с несколькими нулями в старших битах мы говорим о 30-40 циклах. Если число умещается в 16-битном значении, максимальное значение составляет 23 цикла.
Чтобы получить остаток, требуется еще один тактовый цикл.
Если вы делаете это ВСЕ время, конечно, вы можете обнаружить, что это время довольно велико, но я не уверен, что есть тривиальный способ избежать этого.
Как уже говорили другие, компилятор может заменить его чем-то лучшим. Но 15, насколько мне известно, не имеет очевидного быстрого решения (если у вас 16 вместо 15, то мы можем использовать трюк x & 15
).
Если это ограниченный диапазон, вы можете создать таблицу [vector<bool>
, например, которая будет хранить 1 бит на запись], но довольно скоро вы столкнетесь с проблемой, что доступ к некэшированной памяти занимает столько же времени, сколько операция деления. ...
Есть несколько интересных способов выяснить, делится ли число на 3, 5 и т. д., путем суммирования цифр, но, к сожалению, они работают только на основе десятичных цифр, что включает в себя длинную последовательность делений.
person
Mats Petersson
schedule
09.09.2013
a % 15 == 0
: доверяйте компилятору и оборудованию, чтобы сделать это эффективно. - person recursion.ninja   schedule 10.09.2013%
, вряд ли будет оптимальным и портативным решением. - person recursion.ninja   schedule 10.09.2013/
,%
или*
, когда все ответы здесь, кроме принятого, говорят, что вы должны просто использовать%
, пожалуйста, не Закрыть - person aaronman   schedule 10.09.2013