バイトバッファに保存する必要があるlong型の変数があります。2つの整数変数を連結して長い変数を構成する方法
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));
}
}
:Javaですべてのint値が4バイトに適合していると、すべてのlong値を8バイトに格納されている、と私は4バイトの整数を節約する簡単な機能へのアクセスを持っているので、私はこの解決策を考え出しましたreadLong()
が実際にやるべきことをしていないことがわかりました。私がreadLong()
とwriteLong()
を書くときに思ったのは、1つの整数値を左に32ビットシフトし、次の整数で結果をoringするときでした。その結果は望ましい長い値になります。しかし、このサンプルは私が間違っていることを証明した。 2つの整数の間違いは何ですか?
符号ビットの説明をありがとうございます。私はその意義を無視していた。 – Klaus