(毎回新しいPoint
オブジェクトを作成する代わりに)2つのintをlongに格納したいと思います。
現在、これを試しました。それは機能していませんが、何が悪いのかわかりません:
// x and y are ints
long l = x;
l = (l << 32) | y;
そして、私は次のようなint値を取得しています:
x = (int) l >> 32;
y = (int) l & 0xffffffff;
y
は最初のスニペットで符号拡張されており、-1
のたびにx
がy < 0
で上書きされます。
2番目のスニペットでは、シフトの前にint
へのキャストが行われるため、x
は実際にはy
の値を取得します。
long l = (((long)x) << 32) | (y & 0xffffffffL);
int x = (int)(l >> 32);
int y = (int)l;
これは、ビット演算子の代わりにバイトバッファを使用する別のオプションです。速度に関しては、速度は約1/5と遅くなりますが、何が起こっているかを確認するのははるかに簡単です。
long l = ByteBuffer.allocate(8).putInt(x).putInt(y).getLong(0);
//
ByteBuffer buffer = ByteBuffer.allocate(8).putLong(l);
x = buffer.getInt(0);
y = buffer.getInt(4);