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)
,但我认为它不够有效。
如果你看一下。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:值大于零。