我怎样才能获得双倍的符号位?
什么是C#等效于C++我怎样才能获得双倍的符号位?
bool std::signbit(double arg);
此功能的C++参考描述如下: 确定给定的浮点数arg是负的。 该函数检测零,无穷和NaN的符号位。与std :: copysign一起,这个宏是检查NaN符号的两种便携方式之一。
signbit(+0.0) = false
signbit(-0.0) = true
我不知道是否有一个内置的,但这应该工作:基于this answer by Jon Skeet
private static readonly long SignMask = BitConverter.DoubleToInt64Bits(-0.0)^
BitConverter.DoubleToInt64Bits(+0.0);
public static bool signbit(double arg)
{
return (BitConverter.DoubleToInt64Bits(arg) & SignMask) == SignMask;
}
。
逆向工程从微软CRT机器代码,保持快速:
public unsafe static bool stdsign(double d) {
ushort* pd = (ushort*)&d;
return (pd[3] & 0x8000) != 0;
}
通过了所有我知道如何在它扔了测试。假设小端结构。
+1,尽管我宁愿避开“不安全”的代码。 (我怀疑我的效率会降低。) – Deduplicator 2014-10-26 20:48:38
我对英特尔代码的奇怪感到有些沮丧。不知道他们为什么这样做。 – 2014-10-26 21:05:59
是的。如果他们真的需要这样做,为什么他们不使用'ulong *'或'byte *'...... – Deduplicator 2014-10-26 21:09:10
不完全等效,但[此答案](http://*.com/a/4739869/1430156)可能有所帮助。 – 2014-10-26 18:21:28