使用位运算把两个数字合并成一个,且可以还原回原值

        最近有个任务需求,需要在传输的时候把两个数字,合并成一个数字,传输过去后,还能再解析回来,这个跟雪花算法的原理是一样的 

        只需要对两个数字的二进制进行位移,一段放高位,一段放低位,然后组合成一个新整数。

        下面是代码:

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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值