2011-04-23 69 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