C ++移位运算符<<
不会循环。例如,如果你这样做:
// C++
int a = 1;
cout << (a<<38);
你得到0.但是,在Java中,你实际上是循环并获得64的有效值。
我需要将一些C ++代码翻译成Java,那么我使用什么作为<<
的等价物呢?
答案 0 :(得分:9)
如果左侧操作数的提升类型是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