获得零下限的最有效(最快)方法是什么?
Math.max(0, x) 将起作用,对于 x 的任何负值返回 0。但是,我对 Math.* 的经验是,通常有一个性能更高的技巧可以更快地完成它。有人知道这种情况吗?
按位技巧很好;我总是喜欢为这些运营商找到真正的用途。任何会返回假的东西,如果 x 是负数,也可以。
编辑澄清一下,如果 x 大于 0,我想要那个值。所以我不能只做 x < 0,因为那只会给我 true,而不是 x。
获得零下限的最有效(最快)方法是什么?
Math.max(0, x) 将起作用,对于 x 的任何负值返回 0。但是,我对 Math.* 的经验是,通常有一个性能更高的技巧可以更快地完成它。有人知道这种情况吗?
按位技巧很好;我总是喜欢为这些运营商找到真正的用途。任何会返回假的东西,如果 x 是负数,也可以。
编辑澄清一下,如果 x 大于 0,我想要那个值。所以我不能只做 x < 0,因为那只会给我 true,而不是 x。
Math.Max(x, y)
与 eg 基本相同x > y ? x : y
。返回false
何时x
为负应该同样简单:return x < 0 ? false : x
满足您要求的一种方法是:
x > 0 && x
假设您可以接受评估为false
whenx
为 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
查看有关 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));
但是,除非您处于一个紧凑的循环(例如游戏循环)中并且由于Math.max()
(并且简单的三元内联等效项没有提供所需的性能)而表现不佳,否则我不会使用这种摆弄技巧。对于阅读代码的任何人来说,它的作用并不明显,而且几乎肯定需要注释来解释,而Math.max()
它的名称是自我记录的(对大多数程序员而言)。