本文参考链接:博客
适用场景
需要用到二维坐标的如(x,y)的情况的,且x与y范围在int内的。
使用原因
- 内存小
- 易理解
- 理解后使用方便
- 方便储存在set这样的集合中
原理
题目有很多对坐标,普通方法可以用对象或者Pair保存,而也可以通过位运算压缩保存。
- 在64位系统中,int型数据是32位的,long long类型是64位的,那么我们可以让前32位保存一个坐标,后32位保存一个坐标。
- 编码(encode):先将x与y强转成为long long类型,然后将x左移32位(低位补零),然后在异或y,这样高位便是保存的x,低位保存的y。
- 解码(decode):而使用x与y时候,就是个反的过程相当于。如果使用x,那么将x右移32位,强转int即可得到原x坐标。如果使用y,那么直接强转为int,那么前32位便被舍弃,余下的int值为原y。
- 当x与y中有负数时,那么便要在强转后y的前32位设置为0(负数int转成longlong高32位会补1,正补0负补1)
public long getValue(int x,int y)
{
return ((long)sx<<30)|sy;
}