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;
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;
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;
ビット単位演算子の代わりにバイトバッファを使用する別のオプションがあります。スピードを考えれば、速度は約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);
ああ、意味があります。私が持っている1つの質問は、長い0xffffffffLまたはint 0xffffffffを使用してビットマスクするかどうかということです。 – LanguagesNamedAfterCofee
@LanguagesNamedAfterCofeeはい、問題ありません。もしあなたが '0xffffffff'でマスクすれば(Lなし)、それは単なるintなので、'& 'はノーオペレーションであり、' y' *はまだsign extended *を取得します。 – harold
説明ありがとう! – LanguagesNamedAfterCofee