C++シフト演算子<<
は循環しません。たとえば、次の場合:
// C++
int a = 1;
cout << (a<<38);
0を取得します。ただし、Javaでは、実際に循環して有効な値64を取得します。
一部のC++コードをJavaに変換する必要があるので、同等のものとして何を使用し<<
ますか?
Java 言語仕様には次のように記載されています。
左側のオペランドの昇格された型が int の場合、右側のオペランドの下位 5 ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値 0x1f (0b11111) を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は、常に 0 から 31 までの範囲になります。
左側のオペランドの昇格された型が long の場合、右側のオペランドの下位 6 ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値 0x3f (0b111111) を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は常に 0 から 63 の範囲内です。
したがって、あなたの例で(int)(((long)a)<<38)
はうまくいくはずです。
左側のオペランドのプロモートされたタイプがintの場合、右側のオペランドの下位5ビットのみがシフト距離として使用されます。これは、右側のオペランドに、マスク値0x1f(0b11111)を使用したビット単位の論理AND演算子&(§15.22.1)が適用されたかのようです。したがって、実際に使用されるシフト距離は、常に0〜31の範囲になります。
Java言語仕様を参照してください:http://docs.oracle.com/javase/specs/jls/se7/jls7-diffs.pdf