以前虽学习过数字的移位操作,但从未用到,这段时间整天和几个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 的代码~~