您可以进行比较谓词x < y
(如果为 true,则返回 -1,如果为 false,则返回 0)如下所示:(请参阅 Hacker's Delight,第 2 章,子章比较谓词)
((x - y) ^ ((x ^ y) & ((x - y) ^ x))) >> 31;
您没有列出减法,但您可以模拟x - y
with ~(~x + y)
使用其中两个谓词,使1 & ~((x < lower) | (upper < x))
这显然假设 2 的补码负数和 32 位整数在溢出时换行。所以这不是可移植的,但这是这种技巧的常态。
根据要求,这使得总的事情:
int in_range(int x, int lower, int upper)
{
int p = ((x - lower) ^ ((x ^ lower) & ((x - lower) ^ x))) >> 31;
int q = ((upper - x) ^ ((upper ^ x) & ((upper - x) ^ upper))) >> 31;
return 1 & ~(p | q);
}
它仍然有一些减法,如果你真的想要的话,替换它们是微不足道的。
通过使用可以使它稍微短一点>=
and <=
谓词(也可以在 Hacker's Delight 中找到)。
这是我的网站说的correct.
这是一种使用较少运算的方法,请记住我们不能使用减法:
int p = (x | ~upper) & ((x ^ upper) | (~upper + x));
int q = (lower | ~x) & ((lower ^ x) | (~x + lower));
return 1 & ((p & q) >> 31);
它使用<=
来自 HD 的谓词,看起来像(x | ~y) & ((x ^ y) | ~(y - x))
以其纯粹的形式。
这是我的网站说的correct.