如何仅使用按位运算符或算术运算符表示术语(a< b?0:1)?

时间:2014-02-15 18:36:47

标签: conditional bit-manipulation integer-arithmetic

假设变量a和b是32位整数,有一种方法可以比较两者,如果一个< b和1如果a> = b而不使用三元或比较运算符?

2 个答案:

答案 0 :(得分: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中找到那些(和其他人),名称为“比较谓词”。

答案 1 :(得分:0)

首先我们取两个数字的区别。然后我们使用数字作为两个数字的补充这一事实来检查符号。

int Compare(int a, int b)
{
    int c = a - b;
    int k = (c >> 31) & 1 ^ 1;
    return k;
}