以前雖學習過數位移位操作,但從未用到,這段時間整天和幾個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 = 14str1 = 0,1,1,1,0,0,0,0,0,0,str2 = 1110
當然要注意 int 的取值範圍,如果物品id數 超過32位 就不能這樣存了,當然可以再加一個物品類型 判斷,一般情況下,遊戲中同一類型的東西也不會超過這個數。。
以後要多多學習下 c 的代碼~~