将int的位变为long

时间:2012-01-25 11:10:56

标签: java bit-manipulation

我正在为我的一个Java应用程序构建一个轻量级的高精度算术库,并且已经做了相当多的苦恼(双关语)。偶尔我会得到int,必须通过简单的单词扩展转换为long,即long的32个最低有效位应该等于{{1}的位}}

不幸的是,施法只对正数有效。此外,在int的同一算术表达式中使用int会预先隐式转换为long,这意味着,例如如果long为否定,则无效:

i

目前我正在使用以下内容:

long l = (i & 0xffffffffL);

有更优雅的方法吗?

修改

我可能遗漏了一些东西:

long l = (((long)(i >>> 8)) << 8) | (i & 0xff);

这打印出int i = -1; long l = (i | 0xffffffffL); System.out.println(l); 而不是-1我错过了哪些

编辑2:

Ooops ... 4294967295而不是|。怎么****小******到达那里?

编辑3:

没有想法我究竟错过了什么,但这完美无缺:

&

...这使得这个问题完全无关紧要,我想。

2 个答案:

答案 0 :(得分:2)

您是否真的测试了long l = (i & 0xffffffffL);代码?是的,i的值将首先转换为长值,这意味着如果i为正数,则为0分机;如果i为负数,则为1分机。在任何一种情况下,低32位都不会受到影响,所以除非我误解了这个问题,否则&操作应该会给你留下你想要的结果。

答案 1 :(得分:1)

你在第二个例子中写了long l = (i | 0xffffffffL);

应该是:

long l = (i & 0xffffffffL);

然后你会得到你期望的结果。