更改整数值的数据类型,同时将其规范化为 C# 中所述数据类型的最大值

Change an integral value's data type while keeping it normalized to the maximum value of said data type in C#

我想更改一个值,比方说,将类型 int 更改为类型 short,并使该值本身“规范化”为最大值 short 可以存储 - 也就是说,因此 int.MaxValue 将转换为 short.MaxValue,反之亦然。

下面是一个使用浮点数学来演示的例子:

public static short Rescale(int value){
    float normalized = (float)value / int.MaxValue; // normalize the value to -1.0 to 1.0
    float rescaled = normalized * (float)(short.MaxValue);
    return (short)(rescaled);
}

虽然这可行,但似乎使用浮点数学确实效率低下,并且可以改进,因为我们在这里处理二进制数据。我尝试使用位移位,但无济于事。

有符号和无符号值都将被处理 - 这对于浮点解决方案来说并不是真正的问题,但是当位移和进行其他位操作时,这会使事情变得更加困难。

此代码将在性能要求很高的上下文中使用 - 每大约 20 毫秒将被调用 512 次,因此性能在这里非常重要。

我如何使用位操作(或者普通的旧整数代数,如果不需要位操作)来做到这一点,并且在我们操作时避免浮点数学关于整数值?

您应该使用移位运算符。它非常快。 int 是 32 位,short 是 16 位,所以将 16 位右移以将 int 缩放为 short:

int x = 208908324 ;
//32 bits vs 16 bits.
short k = (short) (x >> 16);

只需逆向放大过程即可。显然低位会被零填充。