我想找到一个int值是否已经超过0.或者如果你喜欢,如果两个int有不同的符号。
我希望效率最高,不需要检查边界,即int.MinValue等。
请不要使用数学类。
int prevx = 0;
void Calculate(int x)
{
if(x == 0)
return;
prevx = x;
// if sign(x) != sign(prevx)
if(<your efficient code goes here>)
OnCross();
}
将编译为64位。
修改
我只是比较(x * y)&lt; 0和(x ^ y)&lt; 0和XOR比我的i7上的乘法稍快。所以我在等Harold回答这个并提名它。
*对于2 * 10 + 8循环,XOR显示525ms,乘法555ms *
答案 0 :(得分:4)
对于整数,您可以使用 XOR 并检查符号。
(a ^ b) < 0
如果只有其中一个符号位设置,将为真。
答案 1 :(得分:4)
如果(prevx ^ x) < 0
(xor,而不是取幂)则符号位不同
要知道为什么,如果有人没有,如果符号位不同,那么它们的xor将是1,因为结果的符号是1,它小于零。如果符号位相同,则xor将为零,结果将为零或更多。
与乘法相比,没有溢出问题,并且在大多数处理器上都更快。
答案 2 :(得分:2)
if(x * prevx < 0)
填充文字asdf
答案 3 :(得分:1)
将数字相乘并检查产品是否为&gt;或者&lt; 0