我正在为我的一个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:
我没有想法我究竟错过了什么,但这完美无缺:
&
...这使得这个问题完全无关紧要,我想。
答案 0 :(得分:2)
您是否真的测试了long l = (i & 0xffffffffL);
代码?是的,i
的值将首先转换为长值,这意味着如果i
为正数,则为0分机;如果i
为负数,则为1分机。在任何一种情况下,低32位都不会受到影响,所以除非我误解了这个问题,否则&
操作应该会给你留下你想要的结果。
答案 1 :(得分:1)
你在第二个例子中写了long l = (i | 0xffffffffL);
。
应该是:
long l = (i & 0xffffffffL);
然后你会得到你期望的结果。