什么是C++>>>操作

What is >>> operation in C++

本文关键字:gt 操作 C++ 什么      更新时间:2023-10-16

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

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

有谁知道这个>>>运算符是什么?当然,它不在以下运算符参考列表中:

  • http://msdn.microsoft.com/en-us/library/x04xhy0h%28v=vs.71%29.aspx
  • http://www.cplusplus.com/doc/tutorial/operators/

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

>>>不是

C++的一部分。该博客包含 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++没有符号保留和无符号右移这样的东西,我们只有 >> 运算符,其对负符号值的行为是实现定义的。要模拟类似>>>的行为,您必须在应用移位之前执行一些转换以unsigned int(如您发布的代码片段之后的代码片段所示)。

Java 表达式

x >>> y或多或少等同于C++表达式unsigned(x) >> y

>>>不是C++运算符。我认为它是Java语言中的运算符。不过我不确定!

编辑:

是的。那就是java运算符。查看您提供的文章的链接。本文使用的是Java语言!

它是一个 java 运算符,与C++无关。

然而,博客作者所做的只是通过逐位右移将除法更改为 2(即将值右移 1 类似于除以 2 ^ 1 )。

相同的功能,不同的机器代码输出(在大多数架构中,移位运算几乎总是比乘法/除法更快)。