Как быстро вычислить МОДУЛЬ для делителя больше 8, 16, 32

Я пытаюсь сделать очень быстрые операции MOD. Я видел на нескольких страницах, что мы можем альтернативно вычислить MOD, используя оператор AND с (Divisor-1). Например.:

результат = (100 mod 8) совпадает с результатом = (100 и 7)

Он отлично работает, если делитель меньше 8 бит, но если мы посчитаем (1245 по модулю 67), то увидим, что результат отличается от (1245 и 66).

Итак, как я могу вычислить это быстрее, чем с помощью оператора MOD, предоставляемого языком VB.NET?

Спасибо!


person David BS    schedule 03.08.2015    source источник
comment
Этот метод вычисления MOD работает для 2 ^ n, но я не верю, что он работает для не степеней 2 (например, 8 MOD 6 = 2, но 8 AND 5 = 0).   -  person Jerry Federspiel    schedule 03.08.2015
comment
Вы уверены, что у оператора MOD есть узкое место в производительности?   -  person Jerry Federspiel    schedule 03.08.2015
comment
Спасибо за ответы. Если мы рассмотрим положительные числа 2 ^ N, да, у нас есть хорошее улучшение, связанное с MOD. Но так как подсказка работает только в степени 2, я должен рассматривать инструкцию MOD по умолчанию.   -  person David BS    schedule 03.08.2015


Ответы (2)


Использование побитового AND работает только для модульных степеней 2 (и только положительных, при этом). Для других номеров не работает. См. эту ссылку

Я думаю, что оператор модуля, встроенный в фреймворк, работает быстро, и вы, вероятно, не сможете его улучшить.

person Douglas Barbin    schedule 03.08.2015

Что ж, 100 mod 8 = 100 and 7 работает, потому что 7 — это двоичное 111b.

Какое бы число у вас ни было (десятичное число 100 равно 1100100b), последние 3 двоичных разряда (бита) сохраняются из-за 111b. Для 100 это будет 100b = 4.

Теперь подумайте, что вы пытались сделать с 1245 mod 67.

1245 — это двоичный код 10011011101b.

67 — это двоичное число 1000011b.

Вы видите, почему это не работает?

person Herb    schedule 28.07.2017