web-dev-qa-db-ja.com

Java 2つのintをlongに格納する

(毎回新しい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のたびにxy < 0で上書きされます。

2番目のスニペットでは、シフトの前にintへのキャストが行われるため、xは実際にはyの値を取得します。

long l = (((long)x) << 32) | (y & 0xffffffffL);
int x = (int)(l >> 32);
int y = (int)l;
53
harold

これは、ビット演算子の代わりにバイトバッファを使用する別のオプションです。速度に関しては、速度は約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);
11
Mingwei Samuel