0

假设变量 a 和 b 是 32 位整数,有没有办法在不使用三元或比较运算符的情况下比较两者并返回 0 如果 a < b 和 1 如果 a >= b?

4

2 回答 2

2

你可以这样做,但它并不漂亮。

如前所述,问题是溢出。但是您可以解决它,如下所示:

return ((x - y) ^ ((x ^ y) & ((x - y) ^ x))) >>> 31;

对于签名版本,或

return ((~x & y) | ((~x | y) & (x - y))) >>> 31;

对于未签名的版本。

>>>一个无符号右移,就像在 Java 中一样。

使用它们x = b, y = a以使它们与您的功能相匹配。

您可以在 Hacker's Delight 中以“比较谓词”的名称找到这些(和其他)。

于 2014-02-15T19:50:54.010 回答
0

首先我们取两个数字的差。然后我们使用数字表示为 2 的补码这一事实来检查符号。

int Compare(int a, int b)
{
    int c = a - b;
    int k = (c >> 31) & 1 ^ 1;
    return k;
}
于 2014-02-15T19:18:30.680 回答