查找int值是否快速超过0

时间:2011-12-18 16:14:57

标签: c# optimization bit-manipulation

我想找到一个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 *

4 个答案:

答案 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