[英]What is >>> operation in C++
在這篇博客文章中 ,作者提出了以下錯誤修復建議:
int mid = (low + high) >>> 1;
有誰知道這個>>>運營商是什么? 當然它不在以下運營商參考清單上:
它是什么以及如何解決溢出問題?
>>>
不是C ++的一部分。 該博客包含Java代碼。
在這里查看關於Bitwise移位運算符的Java在線教程。 它說
無符號右移運算符“>>>”將零移動到最左側位置,而“>>”之后的最左側位置取決於符號擴展。
>>>
運算符位於Java代碼段中,它是無符號右移運算符 。 它與>>
運算符在處理有符號值時不同: >>
運算符在移位期間應用符號擴展 ,而>>>
運算符只是在移位“清空”的位位置插入零。
遺憾的是,在C ++中沒有符號保留和無符號右移這樣的東西,我們只有>>
運算符,它在負符號值上的行為是實現定義的。 要模擬像>>>
那樣的行為,你必須在應用移位之前對unsigned int
執行一些強制轉換(如緊接在你發布的代碼片段之后的代碼片段中所示)。
>>>
是Java中的邏輯右移運算符。
它在左側移動零而不是保留符號位。 博客文章的作者甚至提供了一個C ++實現:
mid = ((unsigned int)low + (unsigned int)high)) >> 1;
...如果你右移無符號數,保留了符號位沒有任何意義(因為沒有符號位),因此編譯器顯然使用邏輯移位,而不是算術的。
上面的代碼利用了MSB(假設32位整數為32位):加上low
和high
,它們都是非負整數 ,因此適合31位從不溢出整個32位,但它擴展到MSB。 通過將其向右移位,32位數有效地除以2,並且第32位再次被清零,因此結果為正。
事實上,Java中的>>>
運算符只是一種解決方法,因為該語言不提供unsigned
數據類型。
它是一個java運算符,與C ++無關。
然而,所有博客作者所做的是通過逐位右移來將除法改為2 ^ 1
即將值右移1
,類似於除以2 ^ 1
)。
相同的功能,不同的機器代碼輸出(在大多數架構上,位移操作幾乎總是比乘法/除法更快)。
Java表達式x >>> y
或多或少等同於C ++表達式unsigned(x) >> y
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.