c - 二进制搜索中的逻辑右移防止算术溢出

标签 c algorithm search

在二进制搜索实现中,显然:

mid = (low + high)/2

会导致溢出。我已经阅读了很多文档(如 this ),以下内容可以防止出现问题:

mid = (low + high) >>> 1 

但是,我没有看到这行得通的原因。任何人都可以对此有所了解吗?

最佳答案

>>>> 是 Java 中的无符号右移运算符 (ref)。由于 midlowhigh 是有符号整数,因此添加 lowhigh 可以溢出到负值。 >>> 忽略了这个结果的潜在负数并将它向右移动,就好像它是一个无符号数(在 Java 中,没有无符号数)。

在 C 和 C++ 中,这等同于

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

(在您链接到的文章中明确提及)。

这最终与

相同
mid = ((unsigned int)low + (unsigned int)high)) / 2;

请注意,您可能不想这样做。如果您打算使用无符号值,则应坚持使用无符号值并避免在有符号和无符号之间来回跳动。

关于c - 二进制搜索中的逻辑右移防止算术溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046773/

相关文章:

c - 将指针分配给另一个指针的地址

c - 如何在不使用排序算法的情况下将两个已排序的数组合并到第三个数组中?

c - 为什么头文件包含完整的代码实现?

php - Ajax search pro 高级选项 - 将自定义字段与术语组合

python - 在 python 中导航文本文件搜索

c++ - C编程: translated function from MATLAB to C gives slightly (but significantly) different result

algorithm - Dijkstra 算法是否带有优先级队列句柄未找到目标?

C 中的 Char 置换算法,将输出存储在数组中

c++ - 为什么C++标准要求std::partition来满足不同类型迭代器的不同复杂度?

android - 简单的 Android 搜索教程和必要条件