Java和C++中的位移差异 - 如何协调

nsf*_*y33 3 c++ java bit-manipulation

我在C++中有一些代码,我正在尝试移植到Java,并且存在一个我无法解决的问题.

通过一个例子可以很容易地看到它.在C++代码的某个阶段,我有一个unsigned int h,其值为594076817.然后我计算(h << 10).我得到的结果是2744271872.

在Java中,我有一个很长的594076817.然后我计算(h << 10),我得到608334660608.

我理解/怀疑这是由于表示的差异(unsigned vs signed)并试图沿着这些方式阅读而无济于事.使Java代码获得与C++代码相同的结果的最佳方法是什么?

rge*_*man 7

C++代码似乎以32位整数运行.使用Java的32位整数类型int代码

int h = 594076817;
System.out.println(h << 10);
Run Code Online (Sandbox Code Playgroud)

打印-1550695424(Java的int签名).这是2744271872- 2 32.当数据类型更改为64位整数类型时long,答案会更改:

long h = 594076817L;
System.out.println(h << 10);
Run Code Online (Sandbox Code Playgroud)

这打印608334660608.当你截断低于32位的所有内容时608334660608,你会得到int答案:2744271872.

为了获得所需的结果,这似乎依赖于C++中的溢出,请long在Java中使用,但是通过bit-anding将最后32位进行位掩码0xFFFFFFFFL.