考虑到正负号可以是正,负或零,查找两个数字是否具有相同正负号的最快方法是什么。

通常,您可以这样说两个数字具有相同的符号:

Math.signum(int1) == Math.signum(int2);


您可以使用以下方法对此进行优化:

int1 ^ int2 >= 0;


但是,这是假设零为正。有什么方法可以使true(包括零)返回true。

错误的一些示例是:

a = 0; b = 1;
boolean test = a ^ b >= 0


测试将产生true而不是false。

我运行了一些测试平台,发现按位函数返回值的速度快了将近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是错误的,等等。这与上面的问题不一样!

最佳答案

这是我想出的:

private static boolean signcmp(int x, int y) {
    return ((( x >> 31) | (-x >>> 31)) ^ (( y >> 31) | (-y >>> 31))) == 0;
}

关于java - 最快的两个数字符号比较,包括零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42100517/

10-10 12:55