更改整数值的数据类型,同时将其规范化为 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);
只需逆向放大过程即可。显然低位会被零填充。
我想更改一个值,比方说,将类型 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);
只需逆向放大过程即可。显然低位会被零填充。