Java将long转换为字节 - 哪种方法更有效

时间:2013-09-08 19:30:16

标签: java byte bit-shift endianness

我有两种方法可以将长数据转换为字节数组。

for (int i = 0; i < 7; i++) {
    data[pos + i] = (byte) (value >> (7- i - 1 << 3));
}

for (int i = 7; i >= 0; --i) {
    data[p + i] = (byte)(newl & 0xff);
    newl >>= 8;
}

这两项操作中哪一项效率更高?

3 个答案:

答案 0 :(得分:13)

我建议你看看Java代码是如何做到的。

public final void writeLong(long v) throws IOException {
    writeBuffer[0] = (byte)(v >>> 56);
    writeBuffer[1] = (byte)(v >>> 48);
    writeBuffer[2] = (byte)(v >>> 40);
    writeBuffer[3] = (byte)(v >>> 32);
    writeBuffer[4] = (byte)(v >>> 24);
    writeBuffer[5] = (byte)(v >>> 16);
    writeBuffer[6] = (byte)(v >>>  8);
    writeBuffer[7] = (byte)(v >>>  0);
    out.write(writeBuffer, 0, 8);
    incCount(8);
}

正如您所看到的,没有循环,您的操作就会减少。

最快的方法是不要这样做,而是使用Unsafe.writeLong(),因为这需要很长时间并将其直接放入内存而不是将其分成字节。这可以快10倍以上。

答案 1 :(得分:3)

实际上有一个非常方便的解决方案,可以使用long的实例将ByteBuffer转换为字节:

    long longValue = 123858585l;
    ByteBuffer buffer = ByteBuffer.allocate(8);
    buffer.putLong(longValue);
    // without copy, accesses directly the interal array
    System.out.println(Arrays.toString(buffer.array()));

    // acquire a copy of the buffer's internal byte array
    byte[] longInBytes = new byte[8];
    buffer.rewind();
    buffer.get(longInBytes);
    System.out.println(Arrays.toString(longInBytes));

但是,与其他解决方案相比,我不知道它的性能。

答案 2 :(得分:0)

我更希望你的第二个解决方案,因为它清楚它是如何工作的,并且清洁它的工作原理。 第一个可以很容易地用1表示。需要相当多的思考来检查位移。考虑到移位和添加都是现代计算机上的单周期操作。

考虑到你从右到左剥离字节。 Java传统上使用big-endian命令。你首先想要的是另一个msb。