将字节转换为long:为什么某些实现按位-AND每个字节用0xff?

时间:2015-04-28 01:01:12

标签: java type-conversion bit-manipulation byte long-integer

我正在研究SE6中java.io DataInputStream.readLong()的实施情况:

private byte readBuffer[] = new byte[8];

public final long readLong() throws IOException {
    readFully(readBuffer, 0, 8);
    return (((long)readBuffer[0] << 56) +
            ((long)(readBuffer[1] & 255) << 48) +
            ((long)(readBuffer[2] & 255) << 40) +
            ((long)(readBuffer[3] & 255) << 32) +
            ((long)(readBuffer[4] & 255) << 24) +
            ((readBuffer[5] & 255) << 16) +
            ((readBuffer[6] & 255) <<  8) +
            ((readBuffer[7] & 255) <<  0));

鉴于readBuffer []是一个字节的数组,为什么&每个字节需要255?

当单个字节强制转换为long时,不应该将long的剩余位(9-64)位自动设置为零,从而使&不必要吗? / p>

2 个答案:

答案 0 :(得分:3)

java的字节类型是有符号的,所以0xff(255)== -1,在从byte扩展到int / long期间 - 保留了签名值,所以如果你只有代码:

final byte a = (byte)0xff;
final long b = a;

System.out.println(b); // output here is -1, not 255

所以,这里有一个技巧:

final byte a = (byte)0xff;
final long b = a & 0xff; // binary and between byte A and int 0xff

System.out.println(b); // output here is 255

所以,由于符号扩展,第一个字节变量a被提升为int(并变为0xffffffff),然后我们通过按位AND来截断它

答案 1 :(得分:-1)

防止带负值的字节符号扩展。