簡體   English   中英

如何比較兩個數字以查看哪個更大

[英]How to compare two numbers to see which is greater

比較兩個數字x,y; 如果x> y我返回1,否則返回0。我試圖僅使用>> >>〜!之類的按位運算符來執行此操作。 &| ^ +。

到目前為止,我得到了:

int greaterThan(int x,int y) {
return ((~(x-y))>>31);
}

因此,如果xy為負,則最高有效位將為1。因此我將其取反以得到0,然后對其進行移位以使其返回0。如果xy為正,則最高有效位將為0。對其進行取反以獲得1,然后將其轉換為返回1。這似乎無效。 我做錯了還是遺漏了什么?

您的方法因以下幾個原因而無效:

  • 假設xy是帶符號的值,則減法可能會溢出。 這不僅會導致根據C標准產生不確定的行為 ,而且在溢出自動換行的典型實現上也會產生錯誤的結果。 例如,如果xINT_MINy1 ,則xy將產生INT_MAX ,該位未設置其高位。

  • 如果xy是無符號值,則x=UINT_MAXy=0是您得到錯誤答案的示例。 為了使此測試有效,您必須對xy的值施加條件(例如,都沒有設置高位)。

得出的結論是,為了通過測試“高位”進行比較,您需要比要比較的值中的位數多一位。 在合理的CISC結構的匯編語言中,進位標志提供了此額外的位,特殊的條件跳轉指令(以及進位/借位指令)能夠讀取進位標志的值。 但是,C無法提供訪問這種進位標志的方法。 一種替代方法是使用較大的整數類型(如long long ),以便您可以在結果中獲得額外的收益。 好的編譯器會將其轉換為讀取進位標志,而不是實際執行較大的算術運算。

C標准(1999),第6.5.7章,按位移位運算符,第5段:

E1 >> E2的結果是E1右移E2位位置。 如果E1具有無符號類型或E1具有符號類型和非負值,則結果的值是E1 / 2E2商的整數部分。 如果E1具有帶符號的類型和負值,則結果值是實現定義的。

即,負數向右移位的結果是實現定義的。 一種可能是將“符號位”復制到右側的位中,這正是GCC所做的(因為它導致所有位都設置為-1)。

@Dan,能否請您在第一篇文章中澄清您的問題,即您可以使用的確切內容和不能使用的內容(在您提到的注釋中,您提到了不能使用if / else等)。

無論如何,如果要擺脫意外的-1 ,則應考慮在移位之前將值強制轉換為unsigned int 但是,這不會使您的解決方案完全正確。 嘗試考慮檢查數字的符號位(例如,如果x第一位為0y第一位為1則可以確保x> y)。

暫無
暫無

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

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