最近有个任务需求,需要在传输的时候把两个数字,合并成一个数字,传输过去后,还能再解析回来,这个跟雪花算法的原理是一样的
只需要对两个数字的二进制进行位移,一段放高位,一段放低位,然后组合成一个新整数。
下面是代码:
public static void main(String[] args) {
int key = 10;
int value = 112;
int combinedValue = (key << 16) | value;
System.out.println(combinedValue);
int a = combinedValue >> 16;
// int b = (combinedValue & 0xFFFF);
int b = (int) (combinedValue % Math.pow(2, 16));
System.out.println(a);
System.out.println(b);
}
计算方法解释:
合并后的结果combinedValue的值:10和112进行左移操作后,合并值combinedValue为: 65472
还原出key的值:对combinedValue结果进行右移 16 位
还原出value的值:按位与操作提取出 combinedValue 的低 16 位
655472
10
112
代码解释:
int key = 10;
int value = 112;
// 可以看成 combinedValue = 10 * 2^16 + 112
int combinedValue = (key << 16) | value;
System.out.println(combinedValue);
// 两个数通过多进制合并,第一个数是乘以 2^进制的最大值, 再加上第二个数
int a = combinedValue >> 16;
// 可以看成 combinedValue/2^16
// 0xF = 1111
// 0xFF = 1111 1111
// 0xFFF = 1111 1111 1111
// 0xFFFF = 1111 1111 1111 1111
int b = (combinedValue & 0xFFFF);
// 合并值对当前2^进制取余数
int b = (int) (combinedValue % Math.pow(2, 16));
"""
// 这个稍微复杂,需要查看低位的交集
// combinedValue值为655472,二进制的值是:1010000000 0001110000
// 然后0xFFFF的值二进制为:111111 1111111111
// 低位取交集,都为1则取,最后值二进制为:1110000 = 112
1010 0000 0000 0111 0000
1111 1111 1111 1111
"""
System.out.println(a);
System.out.println(b);