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