如果我问一个非常微不足道的问题,请道歉......但我找不到答案。
我正在阅读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)
,但我认为它不够有效。
答案 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)