Java-将整数复制到长

Java-将整数复制到长,java,Java,我有一个外部系统输出2个表示64位无符号整数的无符号整数。Java将这些整数提取并转换为有符号整数。我在java中将它们称为lower和upper。我想把它放回64位整数。我知道我必须使用带符号的整数,这是可以的 我开始将它们都转换为long,将上面的long移位32位,然后尝试添加它们,但效果不太好,因为转换移动了整数的符号位。所以我开始胡乱添加2^31和其他乱七八糟的东西。我怎样才能做到干净呢 下面是一个例子,为了简单起见,使用2 x 8位到16位的数字 Higher=00000000 lo

我有一个外部系统输出2个表示64位无符号整数的无符号整数。Java将这些整数提取并转换为有符号整数。我在java中将它们称为lower和upper。我想把它放回64位整数。我知道我必须使用带符号的整数,这是可以的

我开始将它们都转换为long,将上面的long移位32位,然后尝试添加它们,但效果不太好,因为转换移动了整数的符号位。所以我开始胡乱添加2^31和其他乱七八糟的东西。我怎样才能做到干净呢

下面是一个例子,为了简单起见,使用2 x 8位到16位的数字

Higher=00000000 lower=11111111
期望结果
0000000011111111
我得到的结果
10000000011111

编辑:这是我认为可以正常工作的代码(我还没有完全测试),但我希望有更干净的东西

private static long combineCounters(int lower, int upper) {
    long lower2 = (long)lower;
    if(lower2 < 0) lower2 += (2L<<31);
    long upper2 = (long)upper;
    if(upper2 < 0) upper2 += (2L<<31);
    long result = lower2 | (upper2<<32);
    return result;
 }
专用静态长组合计数器(int-lower,int-upper){
长期较低2=(长期)较低;
如果(lower2<0)lower2+=(2L
int higher=。。。
整数下限=。。。
长结果=((长)高)
int高=。。。
整数下限=。。。

long result=((long)更高)对于您的情况,首先,您应该将整数值正确地存储到long中。为此,您可以使用0xFFFFFFFFL(前32位为1的long)和值

下面是一个有效的示例:

int upperInt = ...
int lowerInt = ...
long hi = upperInt & 0xFFFFFFFFL;
long lo = lowerInt & 0xFFFFFFFFL;
long c = (hi << 32) | lo;
System.out.println(String.format("0x%X", c));
intupperint=。。。
int lowerInt=。。。
长hi=upperInt&0xffffffffffl;
long lo=低打印&0xFFFFFFFFFFL;

long c=(hi对于您的情况,首先,您应该将整数值正确地存储到long中。为此,您可以使用0xFFFFFFFFL(前32位为1的long)和您的值

下面是一个有效的示例:

int upperInt = ...
int lowerInt = ...
long hi = upperInt & 0xFFFFFFFFL;
long lo = lowerInt & 0xFFFFFFFFL;
long c = (hi << 32) | lo;
System.out.println(String.format("0x%X", c));
intupperint=。。。
int lowerInt=。。。
长hi=upperInt&0xffffffffffl;
long lo=低打印&0xFFFFFFFFFFL;

长c=(您好,请编辑您的问题以包含代码请编辑您的问题以包含未给出正确结果的代码。出于某种原因,我不太确定,对于0和-1,它给出的65535也将失败。您需要考虑到,当您从int转换为long时,位32移到位64。我希望有一点错误。)明智的复制可以避免弄脏around@MikeKulls修正了。@MikeKulls你不需要用
&
切得更高,因为
@MikeKulls我的意思是当我们将
更高
扩展到很长的时候,我们会将符号位扩展到前32位。我称之为不需要的位。这不会给出正确的结果。出于某种原因,我不是这么认为的很确定,对于0和-1,它给出的65535也会失败。你需要考虑到当你从int转换为long时,第32位会移到第64位。我希望有一个按位复制可以避免混乱around@MikeKulls修正了。@MikeKulls你不需要用
&
切得更高,因为
@MikeKulls I意思是当我们把
扩展到更高的
时,符号位会扩展到前32位,我称之为多余的位。