假设我想创建一个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;
这两种方法有什么区别?在所有情况下,它们都会产生相同的结果吗?
答案 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:
方法2: