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++代码相同的结果的最佳方法是什么?
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.