运用位运算压缩二维坐标(x,y)的技巧及原理

本文参考链接:博客

适用场景

需要用到二维坐标的如(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;
}

运用到的题目

LCP 03. 机器人大冒险

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值