是否有一些带位操作的酷算法?
答案 0 :(得分:6)
通常,处理器上的模数和除法运算是相同的。例如,请参阅http://jsimlo.sk/docs/cpu/index.php/div.html。这是在英特尔处理器上实现除法指令。
答案 1 :(得分:5)
大多数情况下,模数只是通过除以两个数来计算的。商存储在一个寄存器中,余数存储在另一个寄存器中。你会追求其余的。
答案 2 :(得分:4)
如果事先知道除数(例如,对于C编译器生成的代码,这是编译时已知的常量)那么有时可以通过乘法实现整数除法(从中可以容易地获得模数)转变。有关详细信息,请参阅this article(警告:这不是轻读)。
在许多处理器中,整数乘法比整数除法快得多;有些处理器甚至没有整数除法操作码( n 位值的乘法可以优化到深度 O(log n)的电路中,而没有已知的在 O(n)深度以下优化分割电路的方法。
答案 3 :(得分:3)
x mod y = x - y *(x / y)
其中(x / y)是整数除法。
答案 4 :(得分:3)
除了如上所述使用DIV
和IDIV
(对于x86)的显而易见的方法之外,以2的幂为模的任何数的结果都可以通过按位来计算: x mod y
其中y是pow2与x AND (y - 1)
相同。大多数编译器在可能的情况下执行此操作,因为除法比按位操作要贵得多。
答案 5 :(得分:1)
检查模2也很容易,因为通常只需要检查最低有效位即可。
引用维基百科:
对于特殊情况,在某些硬件上,存在更快的替代方法。例如,可以将2的幂的模表示为按位与运算:
x%2n == x&(2n-1)
示例(假设x是一个正整数):
x%2 == x&1
x%4 == x&3
x%8 == x&7
在比模运算更有效地实现按位运算的设备和软件中,这些替代形式可以加快计算速度。