在java中将两个int按位转换为long的最快方法是什么?

2 java bit-manipulation type-conversion long-integer

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

但是,我的一些数据是长整数。长整数是java中32位整数的两倍,64位。如何在读取图像时将 long 变为两个整数,更重要的是,返回 long ?由于 Java 没有无符号整数,整数或长整数的最高位是负符号位,即使第 32 位(低整数/像素)将是长整数中的普通位。

大多数将 long 转换为 int 的方法也会丢弃高位,这些高位将或可能包含按位(二进制)信息!

我需要做的是

  1. 将单个 long 转换为两个忠实地包含其位数据的整数
  2. 将两个整数转换回一个忠实地包含其位数据的 long。

Mr.*_*irl 7

无需使用自动装箱(LongInteger,等)。原语工作得很好。以下是您在 Java 编程语言中可以做的最好的事情。

加入

将两个ints组合成一个long

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

 

分裂

检索(高)位 31-16

int hi = (int) (val >> 32);
Run Code Online (Sandbox Code Playgroud)

检索(低)位 15-0

int lo = (int) val;
Run Code Online (Sandbox Code Playgroud)

 

笔记:

请注意以下之间的区别:

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

由于 Java 仅使用有符号位,>>>因此引入了运算符来处理整数,就好像它们是“无符号”一样