C# 有符号定点到浮点的转换

C# signed fixed point to floating point conversion

我有一个温度传感器返回 2 个字节。 温度定义如下:

在 C# 中将这 2 个字节转换为浮点数的最佳方法是什么?

我的解决方案如下,但我不喜欢 2 的幂和 for 循环:

static void Main(string[] args)
{
    byte[] sensorData = new byte[] { 0b11000010, 0b10000001 }; //(-1) * (2^(6) + 2^(1) + 2^(-1) + 2^(-8)) = -66.50390625

    Console.WriteLine(ByteArrayToTemp(sensorData));
}

static double ByteArrayToTemp(byte[] data)
{
    // Convert byte array to short to be able to shift it
    if (BitConverter.IsLittleEndian)
        Array.Reverse(data);
    Int16 dataInt16 = BitConverter.ToInt16(data, 0);

    double temp = 0;
    for (int i = 0; i < 15; i++)
    {
        //We take the LSB of the data and multiply it by the corresponding second power (from -8 to 6)
        //Then we shift the data for the next loop
        temp += (dataInt16 & 0x01) * Math.Pow(2, -8 + i);
        dataInt16 >>= 1;
    }
    if ((dataInt16 & 0x01) == 1) temp *= -1; //Sign bit

    return temp;
}

这可能会稍微更有效率,但我看不出有什么不同:

static double ByteArrayToTemp(byte[] data)
{
    if (BitConverter.IsLittleEndian)
        Array.Reverse(data);

    ushort bits = BitConverter.ToUInt16(data, 0);

    double scale  = 1 << 6;
    double result = 0;

    for (int i = 0, bit = 1 << 14; i < 15; ++i, bit >>= 1, scale /= 2)
    {
        if ((bits & bit) != 0)
            result += scale;
    }

    if ((bits & 0x8000) != 0)
        result = -result;

    return result;
}

计算时你将无法避免循环。