使用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;
}
我对位移操作并不熟悉,所以我认为将有更好的方法来组合有符号整数?
祝你好运, 尔根
答案 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。
这是一个好方法吗?