字节[]到长使用位操作

时间:2014-03-21 17:28:26

标签: java byte bit-manipulation long-integer

我有一个byte[]将字节保存为long。我想将其转换为长使用位操作。我尝试过以下方法:

byte[] b = new byte[]{127, 127};
long result = 0;
for (int i = 0; i < b.length; i++) {
    result <<= 8; // this is the same as l = l << 8;
    result |= (short)b[i] & 0xFF;
}

适用于正字节。但是,字节可以是正数也可以是负数,因此不起作用。

举个例子:

byte[] b = new byte[]{-1, 2};
long result = 0;
for (int i = 0; i < b.length; i++) {
    result <<= 8; // this is the same as l = l << 8;
    result |= (short)b[i] & 0xFF;
}
System.out.println(result);
System.out.println(new BigInteger(b).longValue());

打印65282和-254。我相信BigInteger的结果是正确的,但由于内存问题,我不想使用它。

知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

这取决于您的应用程序需要什么。

byte[] b = new byte[] { -1, 2 }

另一种看待它的方法是十六进制数0xFF02。这是否代表带符号的64位值(65282)?还是带符号的16位值(-254)?或者是无符号的16位值(再次为65282)?或者是无符号的64位值(仍为65282)?

您的代码将其视为带符号的64位值。 BigInteger将其视为带符号的16位值。 BigInteger有另一个构造函数将字节数组视为幅度,使用符号的另一个参数:new BigInteger(+1, b)将导致65282。