我一直在用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;
    }


我对内存和十六进制值的经验还不够丰富,无法将其移植到自己身上,更不用说让我发疯的整个地方的转变。

最佳答案

如果可以使用unsafe进行编译,这将变得很简单:

public static unsafe uint FloatToUInt32Bits(float f) {
    return *((uint*)&f);
}


如果要使用带符号的值,请用uint替换int,但是我想说unsigned更为合理。实际上,这等效于Java的floatToRawIntBits()floatToIntBits()是相同的,除了它总是为所有NaN值返回相同的位掩码。如果您需要该功能,则可以从Java版本复制该if语句,但这可能不是必需的。

您需要为程序集启用“不安全”支持,因此,是否要走这条路完全取决于您。高性能网络库使用不安全的代码并不少见。

关于java - C#等效于Java的Float.floatToIntBits,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26394616/

10-14 14:50
查看更多