通过位操作进行数据的复合存储
比如要将日期和数据的ID进行复合存储,可以使用接位或与位移来完成。
long currTime = System.currentTimeMillis();long originId = 500000L;currTime = 0x1398b3f213b;
注意到按位或的规则:
1 | 1 = 11 | 0 = 10 | 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;