C++ 移位运算符<<
不循环。例如,如果您这样做:
// C++
int a = 1;
cout << (a<<38);
你得到 0。但是,在 Java 中,你实际上循环并得到一个有效值 64。
我需要将一些 C++ 代码翻译成 Java,那么我应该使用什么作为等价物<<
呢?
Java 语言规范指出:
如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。
如果左手操作数的提升类型是长的,那么只有右手操作数的六个最低位被用作移位距离。就好像右手操作数经过位逻辑与运算符 & (§15.22.1) 与掩码值 0x3f (0b111111)。因此,实际使用的移位距离总是在 0 到 63 的范围内,包括 0 到 63。
所以,在你的例子中,(int)(((long)a)<<38)
应该可以工作。
如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。
请参考 Java 语言规范:http ://docs.oracle.com/javase/specs/jls/se7/jls7-diffs.pdf