如何将两个整数变量连接起来形成一个长整型变量

3

我有一个长整型变量,需要保存到字节缓冲区中。由于在Java中,所有int值都适合4个字节,而所有long值都存储在8个字节中,我可以使用一个简单的功能来将整数保存在4个字节中。因此,我想到了这个解决方案:

public class TestApp {

    static byte [] buffer = new byte[8];

    static public void writeInt(int startIndex, int number) {
        buffer[startIndex]     = (byte) (number >> 24);
        buffer[startIndex + 1] = (byte) (number >> 16 & 0x000000FF);
        buffer[startIndex + 2] = (byte) (number >>  8 & 0x000000FF);
        buffer[startIndex + 3] = (byte) (number & 0x000000FF);
    }

    static public int readInt(int startIndex) {
        return
            (buffer[startIndex] & 0xFF) << 24 |
            (buffer[startIndex+1] & 0xFF) << 16 |
            (buffer[startIndex+2] & 0xFF) << 8 |
            (buffer[startIndex+3] & 0xFF);
    }

    static public void writeLong(int startIndex, long number) {
        writeInt(startIndex, (int)(number >> 32));
        writeInt(startIndex + 4, (int)number);
    }

    static public long readLong(int startIndex) {
        long a1 = readInt(startIndex);
        long a2 = readInt(startIndex+4);
        long b= a1 << 32;
        b |= a2;
        return b;
    }

    public static void main(String []args) {
        long r = 817859255185602L;

        writeLong(0, r);
        long test = readLong(0);

        System.out.println(Long.toString(r));
        System.out.println(Long.toString(test));
    }
}

看到readLong()实际上没有完成它应该完成的任务,这让人惊讶。当我编写readLong()writeLong()时,我的想法是将一个整数值左移32位,并将结果与下一个整数进行或运算;结果将变为所需的长整型值。但是这个示例证明了我是错的。两个整数进行或运算有什么问题吗?

2个回答

5
你的问题在这部分:

您的问题出在此处:

long a1 = readInt(startIndex);
long a2 = readInt(startIndex+4);

readInt返回一个int。它自动转换为长整型。转换为长整型并不只是添加四个字节的零。它会将符号位向左扩展。

在这种情况下,a20xb261b0c2。这意味着它最高有效位——符号位——是1。所以它被扩展为长整型0xffffffffb261b0c2

当然,当你将其与移位后的a1进行OR运算时,结果总是0xffffffff________

你应该做的是

long a2 = readInt(startIndex+4) & 0xffffffffL;

通过这样做,可以确保a2的最高四个字节保持为零,并且当您将它们与移位后的a1进行OR运算时,它们将保持中立。


感谢您对符号位的解释。我忽略了它的重要性。 - Klaus

0

RealSkeptic的回答是正确的。但我觉得你似乎在试图重复造轮子。例如,Guava已经有了长整型/整型等与字节数组之间的转换:

    long r = 817859255185602L;
    byte[] buffer = Longs.toByteArray(r);
    long test = Longs.fromByteArray(buffer);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接