2014-09-10 60 views
6

我正在做一個家庭作業,我們應該做一個叫做isGreater(x,y)的函數,如果x大於y,它會返回,但是我們只能和+和!一起使用按位運算符。我已經解決了這個問題,如果x和y具有不同的符號,則使用規則,那麼x> = 0和y < 0或者如果x和y具有相同的符號,那麼只有y-x爲負數。爲什麼這個功能比功能更好?

但是,當我在尋找其他人如何解決它時,我注意到以下方法,無論出於何種原因都能正確工作。

y = ~y; 
return !(((x&y) + ((x^y) >> 1)) >> 31); 

我不能爲我的生命明白爲什麼這個工程,我想這已經是與X中的第一位未在Y或設置的東西?

注意:顯然這只是一個有效的解決方案,如果x和y是int,而不是unsigned int。

+0

這是允許的,隨着!運營商。該解決方案非常有效。 – jamiees2 2014-09-10 21:46:57

+0

對不起,我犯了一個錯誤,不包括+和!運營商。 – jamiees2 2014-09-10 21:53:16

+0

如果我沒有弄錯,如果x是1且y是1,則返回1.那麼函數應該是'isGreaterOrEqual(x,y)'? – indiv 2014-09-10 21:55:03

回答

5

31表示我們只對標誌感興趣。如果((x & y)+((x^y)>> 1))> 0,則x>〜y。
x & y將產生一個數字,其中MSB將是第一個位,其中x具有一個設定位並且y具有0.x^_y將產生一個數字,其中未設定位將表示其中x和y不同。如果我們正確地將它移向正確的話,我們需要它們的總和。只有當x(x,y)>> 1)中的第一個非零位(意味着x被設置且x和y不同的第一個位)與((x^y)>> 1)中的設置位相符(這意味着第一個位設置在一箇中,但未設置在另一箇中)。
如果最高位設置在x中,但未設置在y中,也是在一箇中設置的最高位,而另一箇中未設置 - 這意味着x大於y。

例子:

(shft is x^~y >> 1, res is shft + x&~y) 

x: 000110 
y: 001010 
~y: 110101 
x&~y:000100 
x^~y:110011 
shft:111001 
res: 111101 -> negative 

x: 000110 
y: 000010 
~y: 111101 
x&~y:000100 
x^~y:111011 
shft:111101 
res: 000001 -> positive 

這就是爲什麼它簡化版,無符號的工作BTW(無需登錄那裏)。

+3

它也應該注意右移有符號的數字在C標準中作爲實現依賴。所以這可能不適用於其他編譯器 – 2014-09-10 23:42:59