以前这个问题可能已被问到,但我找不到完全匹配,所以我会尝试一下。
我想将float[]
投射到byte[]
,方式是投放一个float
(丢失信息等),这意味着我只想保留最后8位数组中的每个float
。我找到了一些涉及ByteBuffer的代码,但是这种方法将每个浮点数的所有32位转换为4个字节(每个8位),这不是所需的输出(如果有人感兴趣,链接是http://www.javalobby.org/java/forums/t18962.html)
我没有找到任何代码,所以我只使用了经典的for
循环:
public static byte[] float2ByteArray(float floatArray[]) {
byte[] byteArray = new byte[floatArray.length];
for(int i = 0; i < floatArray.length; i++) {
byteArray[i] = (byte) floatArray[i];
}
return byteArray;
}
我的问题是,是否有更有效的方法来达到我不知道的相同结果?
答案 0 :(得分:1)
循环的一般方法是要走的路。人们可能会修改循环结构(展开等)以获得几个百分点更好的性能,但这通常是您在功能开发的最后阶段(如果有的话)只需要打扰的事情。
这里更多的问题是你没有检查浮动是否适合成一个字节。由于数据类型小于int的操作的java(有点特殊)语义,强制转换:
byte b = (byte) floatValue;
当浮点值超出字节范围时,可能会导致非常丑陋的惊喜。因为隐式地这种转换如下:
int i = (int) floatValue;
byte b = (byte) i;
而 不是你会直觉所期望的。如果floatValue 符合到int而不是字节,则最终的字节值将是截断的 int值。例如:
float f = 256F;
byte b = (byte) f;
结果是字节值为0(零),而不是人们通常期望的127。请注意这一点,并在投射前相应地舍入/剪切浮动值。
就性能而言,浮动 - &gt; int / byte cast是迄今为止最昂贵的操作(每个元素)。