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

Muh*_*han 8 c++ syntax

这篇博客文章中,作者提出了以下错误修复建议:

 int mid = (low + high) >>> 1;
Run Code Online (Sandbox Code Playgroud)

有谁知道这个>>>运营商是什么?当然它不在以下运营商参考清单上:

它是什么以及如何解决溢出问题?

Pra*_*rav 9

>>>不是C++的一部分.该博客包含Java代码.

在这里查看关于Bitwise移位运算符的Java在线教程.它说

无符号右移运算符">>>"将零移动到最左侧位置,而">>"之后的最左侧位置取决于符号扩展.


Ale*_*ler 7

>>>Java中的逻辑右移运算符。

它在左侧移入零,而不是保留符号位。博文的作者甚至提供了一个C++实现:

mid = ((unsigned int)low + (unsigned int)high)) >> 1;
Run Code Online (Sandbox Code Playgroud)

...如果右移无符号数,保留符号位没有任何意义(因为没有符号位),因此编译器显然使用逻辑移位而不是算术移位。

上面的代码利用了 MSB(假设 32 位整数的第 32 位):将low和相加,high 它们都是非负整数,因此适合 31 位,不会溢出完整的 32 位,但它会扩展到 MSB。通过右移,32 位数字被有效地除以 2,并且第 32 位再次被清除,因此结果为正。

事实上,>>>Java 中的运算符只是该语言不提供unsigned数据类型这一事实的一种解决方法。


Mat*_*lia 5

>>>运算符位于Java代码片段中,它是无符号右移运算符。它>>在处理有符号值方面与运算符不同:运算符在移位期间>>应用符号扩展>>>,而运算符仅在移位“清空”的位位置中插入零。

遗憾的是,在 C++ 中,不存在符号保留和无符号右移这样的东西,我们只有运算符>>,其对负符号值的行为是实现定义的。要模拟像您这样的行为,>>>必须unsigned int在应用转变之前执行一些转换(如紧随您发布的代码片段所示)。