等效表达式

时间:2011-04-23 15:31:27

标签: math bitwise-operators modulo

我正在尝试使用按位,加法和/或减法运算符来计算以下等式的等效表达式。我知道有一个答案(它进一步推广适用于任何模数2 ^ a-1,其中a是2的幂),但由于某种原因,我似乎无法弄清楚这种关系是什么。 / p>

初始表达:

x = n % (2^32-1);
c = (int)n / (2^32-1); // ints are 32-bit, but x, c, and n may have a greater number of bits

我对第一个表达式的过程是采用2 ^ 32的模数,然后尝试弥补两个模数之间的差异。我在第二部分遇到了麻烦。

x = n & 0xFFFFFFFF + difference // how do I calculate difference?

我知道差异n%(2^32)-n%(2^32-1)是周期性的(周期为2^32*(2^32-1)),并且从2^32-1的倍数开始到{{1}结束时出现“尖峰”在每个2^32倍数之后,差异图减少1(希望我的描述有意义)

同样,第二个表达式可以用类似的方式计算:

2^32

我认为化妆在c = n >> 32 + makeup // how do I calculate makeup? 的倍数处稳定地增加1(并且在2^32-1的倍数处减少1),尽管我在根据可用的运算符表达这个想法时遇到了麻烦。 / p>

2 个答案:

答案 0 :(得分:0)

我想我已经找到了问题的答案:

首先计算c,然后使用结果计算x。假设比较返回1表示true,0表示false。此外,这些转变都是合乎逻辑的转变。

c = (n>>32) + ((t & 0xFFFFFFFF) >= (0xFFFFFFFF - (n>>32)))

x = (0xFFFFFFFE - (n & 0xFFFFFFFF) - ((c - (n>>32))<<32)-c) & 0xFFFFFFFF

编辑:改变了x(只需要保持低32位,休息是“垃圾”)

答案 1 :(得分:0)

您可以使用以下身份:

n mod (x - 1) = (((n div x) mod (x - 1)) + ((n mod x) mod (x - 1))) mod (x - 1)
n div (x - 1) = (n div x) + (((n div x) + (n mod x)) div (x - 1))

首先来自(ab+c) mod d = ((a mod d) (b mod d) + (c mod d)) mod d

第二个来自展开n = ax + b = a(x-1) + a + b,同时除以x-1