11

C++ 移位运算符<<不循环。例如,如果您这样做:

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

你得到 0。但是,在 Java 中,你实际上循环并得到一个有效值 64。

我需要将一些 C++ 代码翻译成 Java,那么我应该使用什么作为等价物<<呢?

4

2 回答 2

9

Java 语言规范指出:

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。

如果左手操作数的提升类型是长的,那么只有右手操作数的六个最低位被用作移位距离。就好像右手操作数经过位逻辑与运算符 & (§15.22.1) 与掩码值 0x3f (0b111111)。因此,实际使用的移位距离总是在 0 到 63 的范围内,包括 0 到 63。

所以,在你的例子中,(int)(((long)a)<<38)应该可以工作。

于 2013-01-15T18:44:34.780 回答
2

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。

请参考 Java 语言规范:http ://docs.oracle.com/javase/specs/jls/se7/jls7-diffs.pdf

于 2013-01-15T18:51:42.620 回答