比如要将日期和数据的ID进行复合存储,可以使用接位或与位移来完成。
注意到按位或的规则:
因此在反转复合数据的时候,需要保证日期和数据ID的二进制位数不能有1|1的或操作。此处首先让ID值取得较大,同时进行左移操作
此时进行日期与ID的按位与操作时仍会有四位二进制同时为1,其中一个办法是将id的初始值设得更大些,我们采用另一种办法。
注意到时间的值最后三位为毫秒值,可以将其归0减小精度至秒
此时进行复合数据后就不会产生不可逆的后果。
若需要反转求出其值:
long currTime = System.currentTimeMillis();
long originId = 500000L;
currTime = 0x1398b3f213b;
注意到按位或的规则:
1 | 1 = 1
1 | 0 = 1
0 | 0 = 0
因此在反转复合数据的时候,需要保证日期和数据ID的二进制位数不能有1|1的或操作。此处首先让ID值取得较大,同时进行左移操作
long targetId = originId << 32;
targetId = 0x7a12000000000L;
此时进行日期与ID的按位与操作时仍会有四位二进制同时为1,其中一个办法是将id的初始值设得更大些,我们采用另一种办法。
注意到时间的值最后三位为毫秒值,可以将其归0减小精度至秒
Long targetTime = TimeUnit.MILLISECONDS.toSeconds(currTime);
此时进行复合数据后就不会产生不可逆的后果。
Long mark = targetTime | targetId;
若需要反转求出其值:
originId = mark >> 32;
currTime = (mark ^ (id << 32)) * 1000L;