- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我了解 >>>
修复了溢出:当添加两个大的正长时,您最终可能会得到一个负数。有人能解释一下这种按位移位如何神奇地解决溢出问题吗?它与 >>
有何不同?
我的怀疑:我认为这与 Java 使用二进制补码这一事实有关,因此如果我们有额外的空间,溢出是正确的数字,但因为我们没有,所以它变成了负数。因此,当您移位并用零填充时,由于二进制补码,它会神奇地固定。但我可能是错的,有位头脑的人必须确认。 :)
最佳答案
简而言之,(high + low) >>> 1
是一种利用未使用的符号位对非负数进行正确平均的技巧。
在 high
和 low
都是非负的假设下,我们确定最高位(符号位)为零。
所以 high
和 low
实际上都是 31 位整数。
high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
当您将它们加在一起时,它们可能会“溢出”到顶部。
high + low = 1000 0000 0000 0000 0000 0000 0000 0000
= 2147483648 as unsigned 32-bit integer
= -2147483648 as signed 32-bit integer
(high + low) / 2 = 1100 0000 0000 0000 0000 0000 0000 0000 = -1073741824
(high + low) >>> 1 = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
作为带符号的 32 位整数,溢出并翻转为负数。因此 (high + low)/2
是错误的,因为 high + low
可能是负数。
作为无符号 32 位整数,总和是正确的。只需将其除以 2。
当然,Java 不支持无符号整数,所以我们最好除以 2(作为无符号整数)是逻辑右移 >>>
。
在具有无符号整数的语言(例如 C 和 C++)中,它变得更加棘手,因为您的输入可以是完整的 32 位整数。一种解决方案是:low + ((high - low)/2)
最后列举一下>>>
、>>
、/
的区别:
>>>
是逻辑右移。它用零填充高位。>>
是算术右移。它用原始顶部位的副本填充其上部。/
是除法。数学上:
x >>> 1
将 x
视为无符号整数并将其除以 2。它向下取整。x >> 1
将 x
视为有符号整数并将其除以 2。它向负无穷大舍入。x/2
将 x
视为有符号整数并将其除以 2。它向零舍入。关于java - 为什么在 Java 中 (high + low)/2 是错误的,但 (high + low) >>> 1 不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785210/
从下面的链接中读取,我相信当 Nifi 集群中的一个节点出现故障时,数据将不会被处理,直到该节点恢复运行 --- 因此由故障节点处理的流文件/数据不会被另一个节点接管集群中的节点。 https://c
我在这两篇论文中发现了“high-capacity cnn”这个短语: 1. Rich feature hierarchies for accurate object detection and se
目前我想使用来自 http://codepen.io/JaxoDI/pen/DtsdH 的评级系统.但目前它在您从右向左悬停时有效。请随意在给定的链接中尝试一下。但我想要一个从左到右悬停的评级系统。
我读过多篇文章,包括 Jon Bentley 的二分查找章节。这是我对 CORRECT 二进制搜索逻辑的理解,它在我所做的简单测试中有效: binarysearch (arr, low, high,
我的问题与下面的有点不同 CSS Float Logic .我的问题是关于 height 比这更具体的概念。 这里有规则 https://www.w3.org/TR/CSS22/visuren.htm
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
我正在研究树问题 Convert Sorted Array to Binary Search Tree - LeetCode Given an array where elements are sor
我最近将 iPhone 设备中的 iOS 升级到 12.2(为我的应用程序“Match4app”提供对最新版本的支持),这似乎与 Xcode 10.1 不兼容。我应该将 Xcode 更新到 10.2
我了解 >>> 修复了溢出:当添加两个大的正长时,您最终可能会得到一个负数。有人能解释一下这种按位移位如何神奇地解决溢出问题吗?它与 >> 有何不同? 我的怀疑:我认为这与 Java 使用二进制补码这
我有一个关于托管高流量 Rails 应用程序的问题。问题是我有 3/4 年的 Ruby on Rails 应用程序经验,但我以前从未有过高流量网站。我真的很兴奋,因为这对我和我的同事来说是“下一个层次
人们说 Delphi 在整数运算上生成了非常好的优化代码。我在 Delphi 2007 中尝试了以下示例,并看到编译器生成的汇编代码。 program p1000; {$APPTYPE CONSOLE
我目前正在构建一个混合云解决方案,需要将消息写入队列以供稍后处理。队列具有高可用性(99.999+% 的正常运行时间)是绝对必要的。 我的选择是将消息读/写到本地 ZeroMQ 高可用性对或 Azur
我正在使用 Highcharts 创建此条形图。条形的对齐方式不在部分的中间(就像第一个红色条形图不在 2016 年 1 月的中间)。是否有任何选项可以将所有栏放置在每个部分的中间? 最佳答案 我找到
我一直在阅读 Framework Design Guidelines 一书,这是一本关于在 .NET 中设计框架的书,其中摘录了框架设计者对每个部分(例如参数设计、异常处理等)所做的决定。 在参数设计
我正在尝试停止Macbook上的Apache服务器。 我尝试了以下 $ sudo apachectl stop /System/Library/LaunchDaemons/org.apache.htt
如何在高可用性中部署 apache Airflow (正式称为 airbnb 的 Airflow )调度程序? 我不是在询问显然应该在高可用性配置中部署的后端 DB 或 RabbitMQ。 我的主要关
我的内部循环包含一个计算,分析显示有问题。 这个想法是采用灰度像素 x (0 .5,x =0)-1, ... x, erf(x), ... x, tanh(x), .
我们如何定制 HighChart 的 Bubble Chart具有不同的形状。 就像我们代表 4 种不同的事件类型一样,我们不仅需要 4 种不同颜色的气泡,而且还需要每个气泡具有不同的形状,如圆形、三
刚刚注意到我在 Azure 中的文件共享存储出现“ClientOtherError”的概率非常高。他们的成功率在 50-100% 之间。 有人有任何经验可以解释为什么会这样吗? 所附图表以红色/橙色显
我是Elasticsearch的新手,遇到了一个问题,甚至在故障排除方面也遇到了困难。我的Elasticsearch(1.1.1)当前正在使CPU处于运行状态,即使没有进行搜索或建立索引也是如此。 C
我是一名优秀的程序员,十分优秀!