2015-05-07 28 views
0

我工作的一個遊戲,我需要轉換成二進制我區塊ID設置爲switch語句,所以我可以抓住從精靈表正確的瓷磚。如何在java中正確執行二進制開關語句?

我需要轉換該名單中包含了所有可能的磚我需要從255層到只有48個左右的瓷磚成整數,我可以用它來得到我的區塊ID。

我能得到首發這一說法一些幫助?

另外一個X意味着什麼並不重要位被設置在那裏。

編輯:還應該說,這是一個8位數字DCBA4321

enter image description here

回答

2

我電子書籍創造256個值的靜態數組象這樣的每一種可能的組合:

static final int[] DCBA4321_TO_VALUE = { 
    // 0000 
    47, 44, 36,343, 37, 14, 35, 32, 45, 34, 15, 40, 42, 41, 33, 38, 
    // 0001 
    28, 28, 27, 27, 26, 26, 23, 23, 28, 28, 27, 27, 26, 26, 23, 23, 
    // 0010 
    21, 21, 21, 21, 24, 24, 24, 24, 16, 16, 16, 16, 30, 30, 30, 30, 
    // 0011 
    1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 
    ... 
}; 

有這樣陣列就可以簡單地加入你的DCBA和4321個值使用逐移,添加並映射它以價值。這似乎是對我

int getValue(int DCBA, int num) { 
    return DCBA4321_TO_VALUE[(DCBA << 4)+num]; 
} 
+0

看起來很有趣,看起來確實很快。那麼硬編碼值中的下一行是 21 21 24 24 16 16 30 30? 下一行怎麼樣? 1 1 1 1 3 3 3 3? – Snhp9

+0

在答案中增加了兩行。您有一個方便的「低位總和」列,它提供了哪些4321值應映射到目標值的提示。例如,「0-3,8-11」意味着我們應該有8行:位置0-3和位置8-11。 –

+0

從現在開始做得完美謝謝!我會嘗試這個和另一種方法,看看它是如何結果。 – Snhp9

1

我建議你學習Java的位運算符:Click Here

class BitDemo { 
    public static void main(String[] args) { 
    int bitmask = 0x000F; 
    int val = 0x2222; 
    // prints "2" 
    System.out.println(val & bitmask); 
    } 
} 

一旦你屏蔽值,你可以確定正確的瓷磚來抓取。

+0

我仍然在使用switch語句嗎? – Snhp9

1

最快的方法除非你有從dcba4321要你將不得不做一些像下面目標值的數學公式。我已將其分解爲子部分以幫助支持可讀性和維護。

byte dcba = dcba4312 & 0b11110000 >> 4 
byte _4321 dcba4321 & 0b00001111; 

switch (dcba) { 
case 0b0000: 
    return dcba0(_4321); 
case 0b001: 
    return dcba1(_4321); 
... 
    rest of the dcba cases; 
... 
} 

dcba0(byte _4321) { 
    switch (_4321) { 
    case 0: 
     return 47; 
    case 1: 
     return 44; 
    .... 
     rest of the cases 
    .... 
    } 
} 

.... 
rest of the dcbaX methods 
.... 
+0

我會嘗試下面這個和下面的幾個並測試性能。因爲看起來有很多方法可以做到這一點。在這一點上學習很多。 :) – Snhp9