如何连接两个整数变量以形成一个长变量

Kla*_*aus 3 java

我有一个长类型变量,应保存到字节缓冲区.因为在Java中,所有int值都适合4个字节,所有长值都存储在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));
    }
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,它readLong()确实无法完成它应该做的事情.写时,我想什么readLong()writeLong()是转换的一个整数值,当32位leftwise,和或-ING与下一个整数的结果; 结果将成为所需的长值.但这个样本证明我错了.或者两个整数有什么问题?

Rea*_*tic 5

你的问题在这部分:

long a1 = readInt(startIndex);
long a2 = readInt(startIndex+4);
Run Code Online (Sandbox Code Playgroud)

readInt返回一个int.这会自动转换为long.转换为long不会简单地添加四个字节的零.它将符号位向左扩展.

在这种情况下,a20xb261b0c2.这意味着它最重要的位 - 符号位 - 是1.所以它扩展到了长0xffffffffb261b0c2.

当然,当你和那个移位时a1,结果总是如此0xffffffff________.

你应该做的是

long a2 = readInt(startIndex+4) & 0xffffffffL;
Run Code Online (Sandbox Code Playgroud)

这将确保最重要的四个字节a2将保持为零,因此当您将它们与移位后的OR时保持中性a1.