按位Mod的低级实现

时间:2013-11-28 05:39:37

标签: c++ c bit-manipulation modulus

在修改时已经注意到了

(mod(x, n))

我们宁愿使n为2的幂。这有什么帮助,这会更快吗?

5 个答案:

答案 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)