整数和长期转换

时间:2015-12-23 16:52:24

标签: java bit-manipulation

假设我想创建一个long值,里面有两个打包的int。我想带两个int并将它们并排放在long中。我可以想出两种不同的方法来实现这一点,我相信这两种方式都会以同样的方式运作:

int a = 0x7FFFFFFF;
int b = 0x10000000;
long x;

// Method one
x = (a & 0xFFFFFFFFL) << 32 | (b & 0xFFFFFFFFL);

// Method two
x = (long) (a << 32) | (long) a;

这两种方法有什么区别?在所有情况下,它们都会产生相同的结果吗?

1 个答案:

答案 0 :(得分:1)

第二种方法不起作用。除了拼写错误(它应以长b结尾),您的a不会受到转变的影响(感谢 harold 进行更正)。你必须在转移前进行转换。

int a = 0x7FFFFFFF;
int b = 0x10000000;
long x;

// Method one
x = (a & 0xFFFFFFFFL) << 32 | b;

// Method two
x = (((long)a) << 32) | b;

此外,在第二种和第一种方法中,b的转换是多余的。转换是隐式完成的。

这两种方法看起来非常相似。但是,方法1可能会执行一些不必要的操作,因为它将执行额外的AND和转换。

方法1:

  • al&lt; - a I2L
  • res&lt; - al LAND 0xFFFFFFFFL
  • res2&lt; - res LSHL 32
  • bl&lt; - b I2L
  • al OR bl

方法2:

  • al&lt; - a I2L
  • res2&lt; - al LSHL 32
  • bl&lt; - b I2L
  • al OR bl