簡體   English   中英

什么是C ++中的>>>操作

[英]What is >>> operation in C++

這篇博客文章中 ,作者提出了以下錯誤修復建議:

 int mid = (low + high) >>> 1;

有誰知道這個>>>運營商是什么? 當然它不在以下運營商參考清單上:

它是什么以及如何解決溢出問題?

>>>不是C ++的一部分。 該博客包含Java代碼。

在這里查看關於Bitwise移位運算符的Java在線教程。 它說

無符號右移運算符“>>>”將零移動到最左側位置,而“>>”之后的最左側位置取決於符號擴展。

>>>運算符位於Java代碼段中,它是無符號右移運算符 它與>>運算符在處理有符號值時不同: >>運算符在移位期間應用符號擴展 ,而>>>運算符只是在移位“清空”的位位置插入零。

遺憾的是,在C ++中沒有符號保留和無符號右移這樣的東西,我們只有>>運算符,它在負符號值上的行為是實現定義的。 要模擬像>>>那樣的行為,你必須在應用移位之前對unsigned int執行一些強制轉換(如緊接在你發布的代碼片段之后的代碼片段中所示)。

>>>不是C ++運算符。 我認為它是Java語言的運算符。 我不確定!

編輯:

是。 那是java運算符。 查看您提供的文章的鏈接 本文使用的是Java語言!

>>>Java中邏輯右移運算符。

它在左側移動零而不是保留符號位。 博客文章的作者甚至提供了一個C ++實現:

mid = ((unsigned int)low + (unsigned int)high)) >> 1;

...如果你右移無符號數,保留了符號位沒有任何意義(因為沒有符號位),因此編譯器顯然使用邏輯移位,而不是算術的。

上面的代碼利用了MSB(假設32位整數為32位):加上lowhigh ,它們都是非負整數 ,因此適合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.

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