Java位操作:将两个Short值组合为一个Integer的方法?

时间:2019-12-05 03:57:10

标签: java bit-manipulation

在Java中,Integer是32位,而Short是16位。

我试图将2 Short组合为一个整数,并希望将其还原一段时间。
一个Short值存储在较高的16位,另一个存储在较低的16位。

例如,我希望将2个Short值(99、100)存储在一个Integer x中,并在某个时间将其提取出来。

起初,我尝试了位运算(<< 16),但是无法恢复两个数字。

2 个答案:

答案 0 :(得分:1)

如果值可以为负,则需要花费更多的精力来处理下半部分的符号:

int combined = (high << 16) | (low & 0xFFFF);

不需要强制转换,它们是隐式发生的。但是& 0xFFFF部分必须避免在low为负的情况下用上半部分覆盖高半部分。

像这样分割仍然很简单:

short high = (short)(combined >> 16);
short low = (short)combined;

答案 1 :(得分:0)

您可以拆分16位的前半部分和后半部分,以将short值存储在int中。然后从该int提取短裤到两个short。这是一个示例:

public class ShotToInt {

  public static void main(String[] args) {
    short x, y;
    x = 101;
    y = 500;

    // creating the int by storing x in first half and y in last half.
    int xy = ((int) x << 16) | y;

    System.out.println("x=" + x + " y=" + y);
    System.out.println("in bit: " + Integer.toBinaryString(x) + ":" + Integer.toBinaryString(y));
    System.out.println("in bit: " + Integer.toBinaryString(xy));

    // shifting bits to 16 digit to restore the x
    short xx = (short) (xy >> 16);
    // directly casting to short to extract y
    short yy = (short) xy;

    System.out.println("x=" + xx + " y=" + yy);
    System.out.println("in bit: " + Integer.toBinaryString(xx) + ":" + Integer.toBinaryString(y));
    assert x == xx;
    assert y == yy;
  }

}