在修改时已经注意到了
(mod(x, n))
我们宁愿使n为2的幂。这有什么帮助,这会更快吗?
答案 0 :(得分:4)
你的“问题”是相当含糊的,但是你猜是这个想法吗?
x & (n-1)
其中n
是2的幂。这将为您提供x % n
。
答案 1 :(得分:2)
设想位:
Let n = (1000)2 = 8
因此,如果你想知道X / n
的剩余部分,你只需要知道在2的幂的3个点中是否有任何值:
Let X = (1111)2 = 15
^^^ .... these will be the remainder
因此,如果你选择2的幂,并从中减去1,你可以获得为它下面的任何东西设置的所有位:
n - 1 = (1000)2 - (0001)2 = (0111)2
现在看着X:
X = (1111)2
& n - 1 = (0111)2
------------------
= (0111)2
由于逐位操作可以快速完成非常,并且除法运算相对较慢,因此这种模数比分割快得多。
答案 2 :(得分:0)
以2的幂进行修正是& (按位AND)运算符。
mod(x,2 ^ k)= x& û
其中U =((2 ^ k)-1),这是一个常数。
否则,你必须划分并找到余数。按位AND通常是1个时钟周期来执行,而除法要慢得多。这个细节与&的逻辑实现有关。与%。
答案 3 :(得分:0)
要回答为什么更好的问题...... mod(x,y)
几乎与整数除法一样多。不仅仅是简单的AND
操作(取决于您的硬件部门可能需要几个CPU周期)。
稍微偏离主题,但绝对在FPGA(verilog / VHDL)中,AND操作导致使用的硬件远少于除法。
答案 4 :(得分:0)
汇编程序中的div命令(用于计算mod)在shift命令中要贵得多。
通常:1 div = 4班。
功率为2的div可以用移位代替。
n=2 -> shift by 1, mod = i & 1
n=4 -> shift by 2, mod = i & 3
或通常用于任何int i
n=2^i -> shift by i, mod = x & ((2^i)-1)