是否有比x >= start && x <= endC或C ++ 更快的方法来测试整数是否在两个整数之间?
慕田峪4524236
浏览 414回答 3
3回答
ABOUTYOU
只用一个比较/分支就可以做到这一点。它是否能真正提高速度可能会受到质疑,即使它确实如此,它可能太少注意或不关心,但当你只是开始两次比较时,巨大改进的可能性非常小。代码如下:// use a < for an inclusive lower bound and exclusive upper bound// use <= for an inclusive lower bound and inclusive upper bound// alternatively, if the upper bound is inclusive and you can pre-calculate// upper-lower, simply add + 1 to upper-lower and use the < operator. if ((unsigned)(number-lower) <= (upper-lower)) in_range(number);对于典型的现代计算机(即使用二进制补码的任何东西),转换为无符号实际上是一个不必要的 - 只是改变了相同位的查看方式。请注意,在典型情况下,您可以upper-lower在(假定的)循环之外预先计算,因此通常不会贡献任何重要时间。随着减少分支指令的数量,这也(通常)改进了分支预测。在这种情况下,无论数字是低于底端还是高于范围的顶端,都会采用相同的分支。至于它是如何工作的,基本思路非常简单:当被视为无符号数时,负数将大于以正数开头的任何数字。在实践中,此方法将number间隔转换为原点,并检查是否number在区间中[0, D],在哪里D = upper - lower。如果number低于下限:负,如果高于上限:大于D。