C# equivalent to Java's Float.floatToIntBits
本文关键字:Float floatToIntBits equivalent to Java | 更新日期: 2023-09-27 18:26:44
我一直在用Java编写一个网络库的端口,这是我尚未破译并继续阅读的最后一行代码。代码行如下:
Float.floatToIntBits(Float);
返回一个整数。
Java 中floatToIntBits的代码
public static int floatToIntBits(float value) {
int result = floatToRawIntBits(value);
// Check for NaN based on values of bit fields, maximum
// exponent and nonzero significand.
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
result = 0x7fc00000;
return result;
}
我对内存和十六进制值的经验还不够,无法将其移植到自己身上,更不用说到处都是让我抓狂的比特移位了。
看看BitConverter
类。对于双打,它有方法DoubleToInt64Bits
和Int64BitsToDouble
。对于浮动,你可以这样做:
float f = ...;
int i = BitConverter.ToInt32(BitConverter.GetBytes(f), 0);
或更改endianness:
byte[] bytes = BitConverter.GetBytes(f);
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
如果可以使用unsafe
进行编译,这将变得微不足道:
public static unsafe uint FloatToUInt32Bits(float f) {
return *((uint*)&f);
}
如果您想使用带符号的值,请将uint
替换为int
,但我认为无符号更有意义。这实际上相当于Java的floatToRawIntBits()
;floatToIntBits()
是相同的,除了它总是为所有NaN
值返回相同的位掩码。如果您想要该功能,您可以从Java版本中复制if
语句,但这可能是不必要的。
你需要为你的程序集打开"不安全"的支持,所以你是否想走这条路取决于你自己。高性能网络库使用不安全代码的情况并不少见。