2012-01-25 4 views
1

私はJavaアプリケーションの1つのために軽量で高精度の算術ライブラリを構築しています。ときどきintを得るには、longに変換する必要があります。つまり、longの32個の最下位ビットは、intのビットと等しくなるはずです。intのビットをlongにする

残念ながら、キャストは正の数に対してのみ正しく動作します。さらに、longと同じ算術式のintを使用すると、あらかじめ暗黙的にlongにキャストされます。これを行うにはよりエレガントな方法はあり

long l = (((long)(i >>> 8)) << 8) | (i & 0xff); 

long l = (i & 0xffffffffL); 

は現在、私はの線に沿って何かを使用しています: iが負の場合、これは動作しませんか?

EDIT:

int i = -1; 

long l = (i | 0xffffffffL); 

System.out.println(l); 

これは-1ではなく4294967295をプリントアウト:

私は何かが欠けていてもよいです。 何がありますか?私は行方不明ですか?

EDIT 2:

メールで送信... |の代わり&。どのように****は少し******に行ったのですか?

EDIT 3:

は、私はそれを逃した正確にどのようになしアイデアを持っているが、これは完璧に動作します:この質問は完全に無関係になり

long l = (i & 0xffffffffL); 

は...、私は推測します。

+0

あなたの最初のコードはうまくいくはずです - 私はそれを試してみました。例えば 'i'が-1の場合、' l'は4294967295になります。 –

+0

@JonSkeet:あなたはそれを試して、それは動作しますか?それは私のために働くようには見えない - 私の編集を参照してください... – thkala

+0

あなたの編集は '&'の代わりに '|'を使用します... –

答えて

2

実際にlong l = (i & 0xffffffffL);コードをテストしましたか?はい、iの値は、iが正の場合は0拡張、またはiが負の場合は1拡張を意味する長いものに変換されます。どちらの場合も下位32ビットは影響を受けませんので、私が問題を誤解しない限り、&オペレーションでは必要な結果が得られます。

+1

私は* 2回*テストしました。最初の試みは、別のバグが物事を乱した、より大きなコードベースの一部でした。 2回目の自己完結テストにはタイプミスがありました。一言...私は休暇が必要...どこか暖かい...たくさんの優しい女性がいる... – thkala

1

2番目の例ではlong l = (i | 0xffffffffL);と書きました。

それは次のようになります。

long l = (i & 0xffffffffL); 

、その後、あなたが期待している結果を取得します。

+0

ええ、私もそれを捉えました。実際の回答がなくても、時にはSOに投稿した直後に答えが見つかることは時々あります。 – thkala

関連する問題