c#中高效的C风格比较

本文关键字:风格 比较 高效 | 更新日期: 2023-09-27 18:05:03

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

我正在阅读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),但我认为它不够有效。

c#中高效的C风格比较

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

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

如果它对BCL来说足够快,那么它对你来说可能也足够快。

我还建议使用Math.Sign()的各种重载,因为它们适用于所有数字类型(不仅仅是int)。虽然当数字为正数时,它返回1而不是0,但您仍然可以通过测试是否为-1,因此这并不重要。

c#编译器本身进行了许多优化,因此任何发布的解决方案都可能导致与您的示例相同的机器码(不要忘记,在执行汇编时发出的真正的机器码可能取决于当前的CPU等)。

我能找到的从C到c#最准确的翻译是:
sign = -Convert.ToInt32(i < 0)

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

但是,正如我已经写过的,这些技巧在纯c#中很难用。

还可以查看Math.Sign()方法

它返回:

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