利用int数 的移位操作 存储数据

   以前虽学习过数字的移位操作,但从未用到,这段时间整天和几个c程序在一起,学习到不少好的东西。下面就是我看到他们用移位操作来存储 一些数据,还是不错的~~

问题是这样的: 已知一个玩家 和他包裹里拥有的一系列物品id(1,2,3 ...),按照以前的思维,当然是有一个玩家物品表,保存玩家id 和物品id,但是c程序们是这样存的:

假如 要保存 物品id 1,2,3 ,将这3个id 认为是 1110,就是用0和1表示 这个位置上是否有值(从右到左),1110  就是指:分别在 1号,2号 3号位置上有值。这样就可以用一个数据保存这3个id值,1110 就是十进制数14(2+4+8)。 在从数据库中读出后,再用移位操作将14 解析成1110,而且用 1110 这个数 生成玩家的包裹 也十分方便。以下是示例代码,例如 要保存 2,3,4,7 这4个数据:

public class MainTest {

 public static void main(String[] args) {
  int count =10;//假定最大id 为10
  int [] arr = {4,2,3,7};
  int a = getInt(arr);//通过移位操作 将4个数保存成一个数
  System.out.println("a = "+a);
  

  //以下是解析方法
  //------------方法一 通过移位解析----------------
  int [] arr2 = new int [10];
  for (int i = 0; i < count; i++) {
   arr2[i] = (a&(1<<i)) >> i; //这个说实话,我没看懂,但结果是正确的,c程序员说:你写多了就懂了 。。。。
  }
  
  System.out.print("str1 = ");
  for (int i = 0; i < arr2.length; i++) {
   System.out.print(arr2[i] + "," );
  }
  System.out.println();


  //---------方法二,java 自带的方法,通过方法名就能看懂了-------------------
  String str = Integer.toBinaryString(a);
  System.out.println("str2 = "+str);

 }
 
 public static int getInt(int... arr){
  int a = 0;
  for (int i = 0; i < arr.length; i++) {
   a|=(1<<arr[i]);// 1<< 一个值是将1左移,右边补0, 再将a|=这个数,就能将 a的 二进制数 相应的这一位上 置为1,这种方法可以起到 update 的作用,如果已经是1,则不 变化,如果是0 则 update 为 1,可以略加判断,就能知道哪些id数据是新增的,哪些id是已有的
  }
  return a;
 }
}


 

 

运行下程序,结果:

a = 14
str1 = 0,1,1,1,0,0,0,0,0,0,
str2 = 1110


 

当然要注意 int 的取值范围,如果物品id数 超过32位 就不能这样存了,当然可以再加一个物品类型 判断,一般情况下,游戏中同一类型的东西也不会超过这个数。。

以后要多多学习下 c 的代码~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值