Java中的C++移位运算符<<的等价物?

use*_*942 10 c++ java porting

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

// C++
int a = 1;
cout << (a<<38);
Run Code Online (Sandbox Code Playgroud)

你得到0.但是,在Java中你实际上是循环并获得64的有效值.

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

Hot*_*cks 9

Java语言规范状态:

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

如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离.就好像右手操作数受到按位逻辑AND运算符&(§15.22.1)和掩码值0x3f(0b111111)的影响.因此,实际使用的移位距离始终在0到63的范围内,包括0和63.

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

  • C++规范实际上是沿着这些相同的路线说出来的.只有少数值在`<<`的右侧有效,其余值是未定义的行为. (2认同)