11

C++シフト演算子<<は循環しません。たとえば、次の場合:

// C++
int a = 1;
cout << (a<<38);

0を取得します。ただし、Javaでは、実際に循環して有効な値64を取得します。

一部のC++コードをJavaに変換する必要があるので、同等のものとして何を使用し<<ますか?

4

2 に答える 2

9

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)はうまくいくはずです。

于 2013-01-15T18:44:34.780 に答える
2

左側のオペランドのプロモートされたタイプがintの場合、右側のオペランドの下位5ビットのみがシフト距離として使用されます。これは、右側のオペランドに、マスク値0x1f(0b11111)を使用したビット単位の論理AND演算子&(§15.22.1)が適用されたかのようです。したがって、実際に使用されるシフト距離は、常に0〜31の範囲になります。

Java言語仕様を参照してください:http://docs.oracle.com/javase/specs/jls/se7/jls7-diffs.pdf

于 2013-01-15T18:51:42.620 に答える