C 中的大于函数

2024-04-24

我知道这是一个古老的问题,您可能也遇到过这个问题,但我的解决方案中有一个错误,我不知道如何解决它。我需要编写一个比较两个整数的函数。我只允许使用操作 (!,~,&,^,|,+,>>,

isGreater(int x, int y) {
    //returns 1 if x > y.
      return ((y+(~x+1))>>31)&1;
}

我的想法很简单,我们计算 y-x,我们移动 31 以获得符号位,如果它是负数,那么我们返回零,否则我们返回 1。当 x 为负数时,这会失败并且错误地返回 1,尽管它应该返回零。我被困在这个问题上,不知道如何继续。

我们假设整数为 32 位并使用二进制补码表示。这个问题与可移植性无关。 一些帮助将不胜感激。

提前致谢


Hacker's Delight 有一个章节 Comparison Predicates,这正是我们这里需要的。

其中写的一件事是:

x < y: (x - y) ^ ((x ^ y) & ((x - y) ^ x))

我们几乎可以直接使用它,除了x and y应该交换,减法必须用合法的东西代替,结果出现在最高位而不是最低位。幸运的是a - b == ~(~a + b)所以这并不太难。首先应用这些转换:

// swap x <-> y
(y - x) ^ ((y ^ x) & ((y - x) ^ y))
// rewrite subtraction
~(~y + x) ^ ((y ^ x) & (~(~y + x) ^ y))
// get answer in lsb
((~(~y + x) ^ ((y ^ x) & (~(~y + x) ^ y))) >> 31) & 1

我有一个网站here http://haroldbot.nl/?q=%28x+%3Es+y%29+%26+1+%3D%3D+%28%28~%28~y+%2B+x%29+%5E+%28%28y+%5E+x%29+%26+%28~%28~y+%2B+x%29+%5E+y%29%29%29+%3E%3Es+31%29+%26+1这说明它有效。

如果允许局部变量,则可以通过分解子表达式来稍微简化
~(~y + x):

int diff = ~(~y + x);
return ((diff ^ ((y ^ x) & (diff ^ y))) >> 31) & 1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的大于函数 的相关文章

随机推荐