相当于C ++移位运算符<<在Java?

时间:2013-01-15 18:38:08

标签: java c++ porting

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

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

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

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

2 个答案:

答案 0 :(得分:9)

Java language spec州:

  

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

     

如果左侧操作数的提升类型很长,那么只有   右手操作数的六个最低位用作移位   距离。好像右手操作数受到了a   按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x3f   (0b111111)。因此实际使用的换档距离总是在   范围0到63,包括在内。

因此,在您的示例中,(int)(((long)a)<<38)应该有效。

答案 1 :(得分:2)

  

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

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