将2个(带符号)整数合并为一个

时间:2015-03-07 11:21:07

标签: java integer bit-shift

使用android java我需要组合/解码2个整数,其中第二个可以签名。第一个整数是无符号0-4(4位),第二个整数从-128到最大99。 为此我在这里使用HighCommander4描述的操作: Combine two integers into one and decode them later

例如,合并

int id1 = 1;
int id2 = 20; // gives combined = 276

使用HighCommander4s解决方案很容易。 但是如何使用有符号整数来执行此操作,如:

int id1 = 1;
int id2 = -128; // gives combined = -384

现在基于上面链接的解决方案,我创建了以下功能:

public static int encodeInt(int key, int value) {
    return ((key << 8) | (value < 0 ? value * -1 : value)) * (value < 0 ? -1 : 1);
}
public static int decodeInt1(int combined) {
    return combined < 0 ? (combined * -1) >> 8 : combined >> 8;
}
public static int decodeInt2(int combined) {
    return combined < 0 ? ((combined * -1) & 0xFF) * -1 : combined & 0xFF;
}

我对位移操作并不熟悉,所以我认为将有更好的方法来组合有符号整数?

祝你好运, 尔根

1 个答案:

答案 0 :(得分:0)

这是我在一些测试后获得的,假设正整数不超过127且负整数不小于-128:

public static int encodeInt(int key, int value) {
    return (key << 8) | (value < 0 ? value + 256 : value);
}
public static int decodeInt1(int combined) {
    return combined >> 8;
}
public static int decodeInt2(int combined) {
    combined &= 0xFF;
    return combined < 128 ? combined : combined - 256;
}

产生:

encodeInt(0, 0) // 0
encodeInt(0, 20) // 20
encodeInt(0, 127) // 127
encodeInt(0, -128) // 128

encodeInt(1, 0) // 256
encodeInt(1, 20) // 276
encodeInt(1, 127) // 383
encodeInt(1, -128) // 384

依旧...... 仅适用于整数范围-128 - +127,因为+128将在decodeInt2上转换为-128。

这是一个好方法吗?