C#相当于Java的Float.floatToIntBits

时间:2014-10-16 01:02:49

标签: java c# types

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

我对记忆和十六进制值的经验不足以将其移植到我自己身上,更不用说那些让我绝对疯狂的地方。 / p>

2 个答案:

答案 0 :(得分:5)

看一下BitConverter课程。对于双打,它有方法DoubleToInt64BitsInt64BitsToDouble。对于花车你可以做这样的事情:

float f = ...;
int i = BitConverter.ToInt32(BitConverter.GetBytes(f), 0);

或改变字节顺序:

byte[] bytes = BitConverter.GetBytes(f);
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);

答案 1 :(得分:1)

如果您可以使用unsafe进行编译,那么这就变得微不足道了:

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

如果您想使用有符号值,请将uint替换为int,但我会说无符号更有意义。这实际上相当于Java的floatToRawIntBits(); floatToIntBits()是相同的,只是它总是为所有NaN值返回相同的位掩码。如果您需要该功能,则可以从Java版本中复制if语句,但这可能是不必要的。

你需要为你的装配打开'不安全'的支持,所以你是否想要走这条路线取决于你。高性能网络库使用不安全的代码并不罕见。