2013-12-10 55 views
3

我有一組布爾值:x1, y1, z1, x2, z2, x3, y3, z3每一個都是真或假。而不是寫幾十個if語句來檢查的權利真/假的組合,是什麼讓你發現什麼是真正正確的組合絕對是最有效和最快的方式,假?:找到8組布爾值的正確組合的最快方法

if(x1 == true && y1 == true && z1 == true && 
    x2 == true && z2 == true && 
    x3 == true && y3 == true && z3 == true) 
    { 
    //do stuff if this is correct combination 
    } 
else if(x1 == false && y1 == true && z1 == true && 
    x2 == true && z2 == true && 
    x3 == true && y3 == true && z3 == true) 
    { 
    //do stuff if this is correct combination 
    } 
//do on and so forth for the next few dozen lines to check combo's 

我在想的循環與for循環,但這似乎也很慢。這將每秒運行幾十次,所以我試圖儘可能地提高效率。

編輯澄清:y2故意刪除。

的原因,我這樣做是因爲我有一個網格,如下所示:

x1, y1 ,z1 
x2, y2 ,z2 
x3, y3 ,z3 

我試圖找到,如果周圍Y2所有的布爾值設置爲true或false,因爲應用到紋理y2在每種情況下都會有所不同。例如,如果x1,y1和z1爲假但其餘爲真,則y2紋理將設置爲特定圖像。如果x3,z1和x2爲假,其餘爲真,則再次將y2設置爲不同的圖像。我試圖找到y2周圍的項目是打開還是關閉,所以我可以爲y2設置正確的紋理。

+2

只是一些語法建議:你可以刪除'== TRUE'只有做好'&& X1 && Y1 &&。 **編輯**:您也可以嘗試使用'&'而不是'&&'作爲'&'更快一些,但if語句失敗可能需要更長的時間 – RononDex

+1

將它們編碼爲'int'並檢查您感興趣的組合的數值?應該表示你編碼一次,然後執行'if(myEncodedFlags == 42)',假設所有可能的組合中只有少數有用的組合。 –

+1

那麼你有512個可能的組合(19683,如果你考慮FileNotFound)。如果每種組合都是有效的,你必須迎合他們。也許有一些可以應用的模式,例如「跳過所有地方!x3」以減少可能性。 – CodeCaster

回答

6

只是把它轉換成一個數字

x1 = 2^0 = 1 
x2 = 2^1 = 2 
x3 = 2^2 = 4 
x4 = 2^3 = 8 

你可以做到這一點的例子是這樣的:

int digit = 
    (x1 ? 1 << 0 : 0) | (y1 ? 1 << 1 : 0) | (z1 ? 1 << 2 : 0) | 
    (x2 ? 1 << 3 : 0) | (y2 ? 1 << 4 : 0) | (z2 ? 1 << 5 : 0) | 
    (x3 ? 1 << 6 : 0) | (y3 ? 1 << 7 : 0) | (z3 ? 1 << 8 : 0); 

或使用BitArray

BitArray bits = new BitArray(new[] {x1, y1, z1, x2, y2, z2, x3, y3, z3}); 
int[] array = new int[1]; 
bits.CopyTo(array, 0); 
int digit = array[0]; 

這樣的組合:假,真,真,真,將是01111這是15 decima升

那麼您可以在正確的組合存儲爲另一個數字和簡單的檢查,如果他們是平等的

+0

謝謝,看起來像一個偉大的解決方案。會試試這個。 :) – Euthyphro

+0

你確定它速度更快嗎?使用布爾值,只要發現錯誤的值,就可以儘早退出。這只是基本的算術和跳躍。這看起來工作太多,算術運算更多,沒有提前退出,甚至分配對象併爲GC工作。編輯:好的,我看到OP想檢查多個組合。然後,我會選擇第一個移動版本。 – fejesjoco