2011-04-23 96 views
2

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

初始表达式:

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倍数和2^32结束后各2^32多,差异阴谋减少1(希望我的描述意义)

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

c = n >> 32 + makeup // how do I calculate makeup? 

我想化妆在2^32-1(并以2^32的倍数减少1)处稳步增加1,尽管我在用可用的操作员方面表达了这个想法。

回答

0

我想我已经想通了,回答我的问题:

计算C首先,然后用结果来计算x。假定比较返回1为真,0为假。而且,这些转变都是合乎逻辑的转变。

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

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

编辑:改变X(只需要保持低32位,剩下的就是 “垃圾”)

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