当前位置: 首页 > 面试题库 >

检查两个整数是否在0的同一侧的最快方法

终睿
2023-03-14
问题内容

我需要检查两个整数是否多次位于零的同一侧。我不在乎它是正面还是负面,只是它是同一面…而性能非常重要。

目前,我正在这样做:

if (int1 == 0 || int2 == 0) {
    // handle zero
} else if ((int1 ^ int2) > 0) {
    // different side
} else {
    // same side
}

与更明显的情况相比,这(通过caliper测试)的速度提高了30%:

if ((int1 > 0 && int2 > 0) || (int1 < 0 && int2 < 0)) {

可以更快地完成吗?

如果有人想看看我使用的30%测试框架,它就在这里。我用卡尺0.5-rc1

注意: 所有这些解决方案基本上都检查第一位,对于零,该位与一个正数相同。因此,如果这适用于您的应用程序,则无需进行零检查。

基准清单:

  • XOR:错误 修正的原始答案
  • 如果: 明显的((&&)||(&&))解决方案
  • 位: @hatchet的解决方案(>>31) == (>>31)
  • BitAndXor: @greedybuddha的解决方案(0x80000000)
  • BitAndEquals: @greedybuddha的解决方案修改为==不使用^
  • XorShift: @aaronman的解决方案(^)>>31 == 0

卡尺输出:

0% Scenario{vm=java, trial=0, benchmark=XOR} 1372.83 ns; ?=7.16 ns @ 3 trials
17% Scenario{vm=java, trial=0, benchmark=Ifs} 2397.32 ns; ?=16.81 ns @ 3 trials
33% Scenario{vm=java, trial=0, benchmark=Bits} 1311.75 ns; ?=3.04 ns @ 3 trials
50% Scenario{vm=java, trial=0, benchmark=XorShift} 1231.24 ns; ?=12.11 ns @ 5 trials
67% Scenario{vm=java, trial=0, benchmark=BitAndXor} 1446.60 ns; ?=2.28 ns @ 3 trials
83% Scenario{vm=java, trial=0, benchmark=BitAndEquals} 1492.37 ns; ?=14.62 ns @ 3 trials

  benchmark   us linear runtime
        XOR 1.37 =================
        Ifs 2.40 ==============================
       Bits 1.31 ================
   XorShift 1.23 ===============
  BitAndXor 1.45 ==================
BitAndEquals 1.49 ==================

vm: java
trial: 0

看起来@aaronman是赢家


问题答案:

(int1 ^ int2) >> 31 == 0 ? /*on same side*/ : /*different side*/ ;
这不一定正确处理0,我不确定在这种情况下您想做什么。
编辑:还想指出的是,如果这是在c而不是java中,则可以通过消除== 0布尔值在c中的工作方式而进一步优化,尽管



 类似资料:
  • 在JavaScript中,检查两个数组是否具有相同/相等的值(以任何顺序)的最佳方法是什么? 这些值只是数据库实体的主键所以它们总是不同的 方法应该是什么样子的? 另外,这个问题看起来像是重复的,但我没有找到任何与Javascript相关的东西。

  • 问题内容: 我有一个,并且想知道最快的方法是检查所有值是否均为零? 有没有比做更快的方法: 问题答案: 我先将所有字节加总后就重写了这个答案,但是这是不正确的,因为Java已经对字节进行了签名,因此我需要or。 另外,我已将JVM预热更改为正确。 最好的选择实际上是简单地遍历所有值。 我想您有三种主要选择: 或所有元素并检查总和。 进行无分支比较。 与分支进行比较。 我不知道使用Java添加字节的

  • 问题内容: 我有一个的条目: 目前,我正在检查它是否包含真像这样: 这是检查布尔数组的 最快 方法吗?如果不是,执行此检查的最快方法是什么? 编辑: 通过在Android 4.03 Samsung S2设备上将其作为应用程序运行,我对您的答案中的方法进行了计时,如下所示: 在五次跑步中的时间排名最高,排名第一: 在5334和11584 ns之间: } return false; 在160542和1

  • 嗨,我正在尝试解决Udemy练习:编写一个名为hasSharedDigit的方法,其中包含int类型的两个参数。 每个数字应在10(含)-99(含)之间。如果其中一个数字不在范围内,则该方法应返回false。 如果两个数字中都有数字,例如12和23中的2,则该方法应返回true;否则,该方法应返回false。 我一直在得到真实,而有共享数字(9,99)我无法发现为什么.. }

  • 问题内容: 知道列表中是否存在值(列表中包含数百万个值)及其索引是什么的最快方法是什么? 我知道列表中的所有值都是唯一的,如本例所示。 我尝试的第一种方法是(在我的实际代码中为3.8秒): 我尝试的第二种方法是(速度提高2倍:我的真实代码为1.9秒): 堆栈溢出用户建议的方法(我的实际代码为2.74秒): 在我的真实代码中,第一种方法花费3.81秒,第二种方法花费1.88秒。这是一个很好的改进,但