Тесты быстрой делимости (на 2,3,4,5, .., 16)?

Какие тесты на делимость самые быстрые? Скажем, для архитектуры с прямым порядком байтов и 32-битного целого числа со знаком: как очень быстро вычислить, что число делится на 2, 3, 4, 5, ... до 16?

ПРЕДУПРЕЖДЕНИЕ: данный код является Только ПРИМЕР. Каждая линия независима! Просто очевидное решение, использующее операцию по модулю, работает медленно на многих процессорах, у которых нет оборудования DIV (например, многих ARM). Некоторые компиляторы также не могут производить такую ​​оптимизацию (скажем, если делитель является аргументом функции или от чего-то зависит).

Divisible_by_1 = do();
Divisible_by_2 = if (!(number & 1)) do();
Divisible_by_3 = ?
Divisible_by_4 = ?
Divisible_by_5 = ?
Divisible_by_6 = ?
Divisible_by_7 = ?
Divisible_by_8 = ?
Divisible_by_9 = ?
Divisible_by_10 = ?
Divisible_by_11 = ?
Divisible_by_12 = ?
Divisible_by_13 = ?
Divisible_by_14 = ?
Divisible_by_15 = ?
Divisible_by_16 = if(!number & 0x0000000F) do();

и особые случаи:

Divisible_by_2k = if(number & (tk-1)) do();  //tk=2**k=(2*2*2*...) k times
34
задан psihodelia 2 August 2011 в 13:41
поделиться