读书人

经过位操作进行数据的复合存储

发布时间: 2012-12-18 12:43:41 作者: rapoo

通过位操作进行数据的复合存储
比如要将日期和数据的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;

读书人网 >编程

热点推荐