1

获得零下限的最有效(最快)方法是什么?

Math.max(0, x) 将起作用,对于 x 的任何负值返回 0。但是,我对 Math.* 的经验是,通常有一个性能更高的技巧可以更快地完成它。有人知道这种情况吗?

按位技巧很好;我总是喜欢为这些运营商找到真正的用途。任何会返回假的东西,如果 x 是负数,也可以。

编辑澄清一下,如果 x 大于 0,我想要那个值。所以我不能只做 x < 0,因为那只会给我 true,而不是 x。

4

3 回答 3

2

Math.Max(x, y)与 eg 基本相同x > y ? x : y。返回false何时x为负应该同样简单:return x < 0 ? false : x

于 2012-07-02T04:59:30.653 回答
2

满足您要求的一种方法是:

x > 0 && x

假设您可以接受评估为falsewhenx为 0 或负数的表达式。如果您只想false何时x为负,您可以执行以下操作:

x >= 0 && x

例子:

3 > 0 && 3;     // result: 3
-1 > 0 && -1;   // result: false
0 > 0 && 0;     // result: false

0 >= 0 && 0;    // result: 0
于 2012-07-02T05:08:06.113 回答
1

查看有关 min/max的Bit Twiddling Hacks部分。

这是他们在 C 中的示例...

int x;  // we want to find the maximum of x and y
int y;   
int r;  // the result goes here 

r = x ^ ((x ^ y) & -(x < y)); 

这对于适应 JavaScript 来说是微不足道的......

var x, y, r;

r = x ^ ((x ^ y) & -(x < y));

js小提琴

但是,除非您处于一个紧凑的循环(例如游戏循环)中并且由于Math.max()(并且简单的三元内联等效项没有提供所需的性能)而表现不佳,否则我不会使用这种摆弄技巧。对于阅读代码的任何人来说,它的作用并不明显,而且几乎肯定需要注释来解释,而Math.max()它的名称是自我记录的(对大多数程序员而言)。

于 2012-07-02T05:00:28.970 回答