什么是C++>>>操作
What is >>> operation in C++
在这篇博文中,作者提出了以下错误修复建议:
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 位):添加 low
和 high
,它们都是非负整数,因此适合 31 位永远不会溢出完整的 32 位,但它扩展到 MSB。通过将其向右移动,32 位数字有效地除以 2,第 32 位再次清除,因此结果是肯定的。
事实是,Java 中的 >>>
运算符只是该语言不提供unsigned
数据类型这一事实的一种解决方法。
>>>
运算符位于 Java 代码段中,它是无符号的右移运算符。它与>>
运算符在处理有符号值方面有所不同:>>
运算符在移位期间应用符号扩展,而>>>
运算符只是在移位"清空"的位位置插入一个零。
可悲的是,C++没有符号保留和无符号右移这样的东西,我们只有 >>
运算符,其对负符号值的行为是实现定义的。要模拟类似>>>
的行为,您必须在应用移位之前执行一些转换以unsigned int
(如您发布的代码片段之后的代码片段所示)。
x >>> y
或多或少等同于C++表达式unsigned(x) >> y
。
>>>
不是C++运算符。我认为它是Java语言中的运算符。不过我不确定!
编辑:
是的。那就是java运算符。查看您提供的文章的链接。本文使用的是Java语言!
它是一个 java 运算符,与C++无关。
然而,博客作者所做的只是通过逐位右移将除法更改为 2(即将值右移 1
类似于除以 2 ^ 1
)。
相同的功能,不同的机器代码输出(在大多数架构中,移位运算几乎总是比乘法/除法更快)。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- EASTL矢量<向量<int>>连续的
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?