0

シミュレーター(マシュマロ、OSX 64ビット)で動作するAndroidアプリで非常に簡単なテストを作成し、logcat出力を作成するとします。

Log.i("test","long int = "+17301768L);
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19  | 1<<24));
Log.i("test","long int = "+ 8607236360L);
Log.i("test","long int = "+(1<<3 | 1<<8 | 1<<19  | 1<<24  | 1<<33));

…logcat 出力:

long int = 17301768
long int = 17301768
long int = 8607236360
long int = 17301770

明らかに、最後の行は正しくありません。3 行目と同じにする必要があります。

なんで ?どうすれば期待どおりに動作させることができますか?

4

1 に答える 1

3

デフォルトでは、Java のすべての数値は型intです。したがって、二項演算を使用して作成する数値も int 値です。

(1<<3 | 1<<8 | 1<<19  | 1<<24  | 1<<33)

1<<33 = 2
1L<<33 = 8589934592

int値は、正/負の値を示すために 31 ビット + 1 ビットに制限されます。したがって、34 番目のビットを設定しても何も変わりません。

それを機能させるには、int に収まらないすべてのビットに対して明示的に long 値を使用する必要があります。数字にロングを表す「L」を追加することで、これを行うことができます。

    System.out.println((1<<3 | 1<<8 | 1<<19 | 1<<24 | 1L <<33)); // 8607236360
于 2016-03-24T10:41:29.147 に答える