2012-10-07 16 views
24

2つのintをlongに格納したい(毎回新しいPointオブジェクトを作成する必要はありません)。2つの整数をlongに格納するJava

現在、私はこれを試しました。それは働いていないが、私はそれと間違っているかわからない:

// x and y are ints 
long l = x; 
l = (l << 32) | y; 

そして、私はそうのようなint型の値を取得しています:

x = (int) l >> 32; 
y = (int) l & 0xffffffff; 

答えて

47

yは、最初に符号拡張なっていますスニペット。x-1と書き換えると、いつでもy < 0となります。

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

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

ああ、意味があります。私が持っている1つの質問は、長い0xffffffffLまたはint 0xffffffffを使用してビットマスクするかどうかということです。 – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofeeはい、問題ありません。もしあなたが '0xffffffff'でマスクすれば(Lなし)、それは単なるintなので、'& 'はノーオペレーションであり、' y' *はまだsign extended *を取得します。 – harold

+0

説明ありがとう! – LanguagesNamedAfterCofee

9

ビット単位演算子の代わりにバイトバッファを使用する別のオプションがあります。スピードを考えれば、速度は約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(1); 
関連する問題