【发布时间】:2017-02-07 21:40:22
【问题描述】:
考虑到符号可以是正数、负数或零,找到两个数字是否具有相同符号的最快方法是什么。
通常,您可以这样说两个数字具有相同的符号:
Math.signum(int1) == Math.signum(int2);
你可以使用这个来优化它:
int1 ^ int2 >= 0;
但是,这是假设零是正数。有哪些方法会返回 true,包括零。
一些错误示例如下:
a = 0; b = 1;
boolean test = a ^ b >= 0
测试会产生真而不是假。
我运行了一些测试平台,发现按位函数返回值的速度快了近 4 个数量级。由于这是我将在一个非常大的树中为每个节点使用的函数,因此我需要尽可能地优化它。
我会发布一个尝试过的解决方案,但我找不到比原来的解决方案更好的解决方案。
编辑:我意识到这里发现了一个类似的问题:Fastest way to check if two integers are on the same side of 0 我在问是否有办法找出符号是否相同,包括零。所以 1 和 1 之间的比较为真,-1 和 -1 为真,0 和 0 为真,0 和 1 为假,0 和 -1 为假,等等。这与上面提出的问题不同!
【问题讨论】:
-
放手吧。你不能对效率感兴趣而选择用java开发。为提高效率,请选择汇编语言、c 或(可能)fortran 之类的语言
-
这是我上面链接的问题的答案:
(int1 ^ int2) >> 31 == 0 ? /*on same side*/ : /*different side*/ -
@Andremoniy 我已经检查了这个解决方案。这不处理我在标题中提到的为零的情况。
-
@DwB,我们已经不是 1996 年了。
标签: java bit-manipulation sign zero