在Java中,将两个整数按位转换为长整型的最快方法是什么?

3

我一直在使用图像来存储数据,因为通过Paint.net编辑二进制数据比大多数十六进制编辑器更加友好。

然而,我的一些数据是长整型。长整型在Java中是32位整数的两倍,即64位。如何将长整型转换为两个整数,并且更重要的是,在读取图像时如何将它们转换回长整型?由于Java没有无符号整数,整数或长整数的最高位是负数标志位,即使第32位(较低的整数/像素)在长整型中是普通位也是如此。

大多数将长整型转换为整数的方法也会丢弃上位比特,这些比特可能包含位(二进制)信息!

我的需求是:

  1. 将单个长整型转换为两个整数,以忠实地包含其位数据
  2. 将两个整数转换回一个长整型,以忠实地包含它们的位数据。

Java如何将两个int存储在一个long中 - Mr. Polywhirl
虽然棘手的部分是将其恢复,但位移并不是什么大问题,搜索没有找到第二部分的解决方案。 - user1086498
3个回答

9

不需要使用自动装箱(LongInteger等)。原始类型可以正常工作。以下是Java编程语言中最好的方法。

连接

将两个int组合成一个long

int lo; // Integer to fill lower bits
int hi; // Integer to fill upper bits
long val = (((long) hi) << 32) | (lo & 0xffffffffL);

分割

获取31-16位(高位)的数据

int hi = (int) (val >> 32);

获取(低)位15-0的值

int lo = (int) val;

注意:

要注意以下两个操作的区别:

  • n >> 32 (符号扩展右移)
  • n >>> 32 (零填充右移)

由于 Java 只使用了有符号位,因此引入了>>>操作符来处理整数,就像它们是"无符号"一样。


按位与运算符真的必要吗?整数始终是4个字节,我有什么遗漏的吗?是否存在一个值,其中int & 0xffffffffL会改变任何东西? - Wasabi Thumbs

1
int u,v
long n = u;
if (v < 0) { ++n; }
n <<= 32;
n += v;

2
虽然这段代码可能回答了问题,但提供关于它如何以及为什么解决问题的额外上下文会提高答案的长期价值。- 来自审查 - Michael Parker

-1

你需要创建两个具有相同值的新长整型变量,或者你可以将整型变量强制转换为长整型。

int x = 0;
(long) int x = 2;

这声明了一个初始值为0的新整数,一旦它变成long类型,就会将值更改为2。

简单回答,希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接