簡體   English   中英

為什么這比功能大?

[英]Why does this greater than function work?

我正在做一個家庭作業,我們應該創建一個名為isGreater(x,y)的函數,如果x大於y則返回,但我們只能使用按位運算符和+和!。 我已經解決了問題,如果x和y有不同的符號,則使用規則,然后x> = 0且y <0或者如果x和y具有相同的符號,則僅當yx為負時。

然而,當我環顧四周其他人如何解決它時,我注意到以下方法無論出於何種原因都能正常工作。

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

我不能為我的生活理解為什么這有效,我認為這與x中的第一位沒有設置在y或其他東西有關?

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

31表示我們只對標志感興趣。 如果((x&y)+((x ^ y)>> 1))> 0則x> ~y。
x&〜y將產生一個數字,其中MSB將是第一位,其中x具有設置位並且y具有0.x ^ ~y將產生一個數字,其中未設置位將表示x和y不同的位。 如果我們將它正確地移動一個,我們需要他們的總和變得積極。 只有當x和y的第一個非零位(意味着設置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(沒有跡象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM