C#中的高效C风格比较

时间:2011-08-09 13:37:24

标签: c# bit-manipulation

如果我问一个非常微不足道的问题,请道歉......但我找不到答案。

我正在阅读Bit twiddling hacks页面,它在代码示例中使用了C. 我尝试用C#测试它们但是从第一个开始就失败了。

例如,

int v;      // we want to find the sign of v
int sign;   // the result goes here 

// CHAR_BIT is the number of bits per byte (normally 8).
sign = -(v < 0);  // if v < 0 then -1, else 0.

这里C#在最后一行失败,因为C#比较返回true或false而不是1或0。

所以我的问题是在C#中实现这种类型的操作的最佳方法是什么?

我当然可以做sign = -(v < 0 ? 1 : 0),但我认为它不够有效。

3 个答案:

答案 0 :(得分:2)

如果你看一下.NET中int Math.Sign()重载的代码,它看起来像这样:

public static int Sign(int value)
{
    if (value < 0)
    {
        return -1;
    }
    if (value > 0)
    {
        return 1;
    }
    return 0;
}

如果BCL的速度足够快,那对你来说也可能足够快。

我还建议只使用Math.Sign()的各种重载,因为它们适用于所有数字类型(不仅仅是int s。)当数字为0时,它确实返回1而不是0好的,你仍然只能测试为-1,所以它不应该真正重要。

答案 1 :(得分:1)

C#编译器本身进行了许多优化,因此任何发布的解决方案都可能产生与您的示例相同的机器代码(不要忘记在执行程序集时会发出真正的机器代码,并且可能因当前CPU等而异。 )。

从C到C#的最准确的翻译我可以找到:

sign = -Convert.ToInt32(i < 0)

因为C代码使用“boolean”和整数值之间的隐式转换。 (我引用了布尔值,因为在C中所有布尔值实际上都是整数)。

尽管如此,正如我已经写过的那样,这些技巧在纯粹的C#中几乎没用。

答案 2 :(得分:0)

同时查看Math.Sign()方法

它返回:

  • -1:值小于零。
  • 0:值等于零。
  • 1:值大于零。