Для двух произвольных чисел лучше всего проверить, является ли a % b == 0
.Оператор модуля имеет различную производительность в зависимости от аппаратного обеспечения, но ваш компилятор может понять это гораздо лучше, чем вы.Оператор модуля является универсальным, и ваш компилятор определит лучшую последовательность инструкций для любого оборудования, на котором вы работаете.
Если одно из чисел является константой, ваш компилятор может оптимизировать, выполнив некоторыеКомбинация сдвигов и вычитаний битов (в основном для степеней двойки), поскольку аппаратный div / mod медленнее, чем сложение или вычитание, но на современных процессорах задержка (уже всего несколько наносекунд) скрыта тоннами других приемов производительности, поэтому выне нужно беспокоиться об этом.Никакое аппаратное обеспечение не вычисляет модуль с помощью повторного деления (некоторые старые процессоры делали с помощью повторяющихся битовых сдвигов и вычитания, но они все еще использовали для этого специализированное оборудование, поэтому аппаратное обеспечение все же быстрее, чем пытаться эмулировать его в программном обеспечении).Большинство современных ISA фактически вычисляют и деление, и остаток в одной инструкции.
Единственная оптимизация, которую может быть полезной, - это если делитель имеет степень двойки.Затем вы можете использовать &
, чтобы замаскировать младшие биты (делителем - 1) и сравнить результат с нулем.Например, чтобы проверить, делится ли a
на 8, a & 7 == 0
эквивалентно.Хороший компилятор сделает это за вас, поэтому просто придерживайтесь %
.