2017-07-02 41 views
2
if (boolThing[0] == true 
     && boolThing[2] == true 
     && !boolThing[1] 
     && !boolThing[3] 
     && !boolThing[4]) 
    { 
     Debug.Log("Hey"); 
    } 

我想了解如何執行此操作的不同方法。僅檢查數組或列表中的特定布爾值

當0和3爲真而其餘爲假時,代碼執行某些操作。

是否有「更清潔」或「更有效」的方式來做到這一點?

+1

'boolThing [0] == true'只能是'boolThing [0]'。 '== true'是多餘的。 – Guy

回答

1

你不需要if(boolThing[0]==true)。你可以使用`if(boolThing [0]))

你也可以使用二元運算符一起評估幾個布爾值。

if((bools[0]&bools[3]) && !(bools[1]|bools[2]|bools[4]|bools[5]) 

可以使用BitArray輕鬆地與布爾的採集工作,這將是更有效的。

最有效的方法將是使用數字類型。

最簡單的方法是使用枚舉和標誌。您可以使用二元運算符來設置或清除枚舉的標誌。

[Flags] 
public enum MyBoolFlag 
{ 
    None, 
    Bool0 = 1<<0, 
    Bool1 = 1 << 1, 
    Bool2 = 1 << 2, 
    Bool3 = 1 << 3, 
    Bool4 = 1 << 4, 
    Bool5 = 1 << 5, 
    //etc 
} 

而你使用二進制操作來設置標誌。

MyBoolFlag myFlag = MyBoolFlag.Bool0|MyBoolFlag.Bool1|MyBoolFlag.Bool3; 

在您的代碼,您現在可以檢查:

if(myFlag == MyBoolFlag.Bool0|MyBoolFlag.Bool3) 
{ 

} 

您可以定義常量各種條件。

const MyBoolFlag myCondition1 = MyBoolFlag.Bool0|MyBoolFlag.Bool3; 

再檢查:

if(myFlag == myCondition1) 
{ 

} 

你也可以做一些更多的跑腿和使用類型,如原生類型,字節和直接詮釋。

您可以使用一個字節來保存8個布爾值作爲標誌掩碼,每個掩碼錶示2的冪。 uint32可以保存32,而uint64可以保存64個布爾值。

這有巨大的性能提升,因爲布爾值被存儲爲uint32,這意味着它使用4個字節的數據,並且當您使用位請求布爾標誌時,您可以在uint32中打包32個布爾值。

程序也將執行得更快,因爲CPU在使用本地機器字的單個操作中評估myFlag == myCondition1。否則,需要很多指令來將查找布爾值置於數組中並進行比較。 。Net也會做一些健全的檢查,確保你的數組不是空的,你的索引不超出範圍,然後需要移動指針來查找這些值。

爲了方便起見,您可以從布爾值數組中創建一個bitarray,然後使用它來設置適當的標誌位來初始化一個數值類型的數組。

例如:

bool[] bools = new bool[] { true, false, false, true, false, false }; 
BitArray bitArray = new BitArray(new bool[] { true, false, false, true, false, false }); 
int[] array = new int[1]; 
bitArray.CopyTo(array, 0); 
int value = array[0]; 

的這點是 '價值' 將是9,如果布爾變量[0] =真及的bool [3]真。

所以,你的代碼將乾淨是:

if(value==9) // bools[0]&bools[1]==true; 

您還可以創建不斷口罩檢查不同的數值,以檢查是否不同位在數值設定或使用二進制運算操作的位。

通過使用二元運算設置數值,可以獲得更高的效率。

uint32 myFlag= 1|(1<<3); 
+0

在你的例子'(bools [0]&bools [3])&&!(bools [1] | bools [2] | bools [4] | bools [5])''在開始時,不需要「單個「'&'和'|'運算符。這是浪費,只需在那裏使用'&&'和'||'。 –

+1

'&&'會起作用,但需要三個操作來評估第一組是否爲真,但'&'需要一個。使用'&&'第一個操作檢查bools [0]是否爲真,第二個如果bools [1]爲真,第三個是paranthesis中的'&&'操作符。使用'&'二元運算將bools [0]和bools [1]合併爲一個結果,然後評估它是否爲真。你可以編碼並查看VS中的反彙編來驗證。由於使用「||」,下半年還會有更多的jmp。您可以使用兩百萬次運行循環來驗證。 –

+0

有趣。在你的百萬次驗證循環中,「bools」的內容每次都相同嗎?爲什麼不在'final'中間操作中使用'&',如果你在括號內部執行它?短路和非短路的混合看起來很奇怪。如果我拿出子表達式'bools [1] | bools [2] | bools [4] | bools [5])'作爲例子,你必須檢查所有的數組條目,即使'bools [1] '已經是'true'。但檢查數組條目非常快,所以這是一個特殊情況。 「||」之前的'|'鏈應該多久才能更有效率? –

2

你能做到這一點,在Unity

if(boolThing.SequenceEqual(new bool[] { true, false, true, false, false}) 
{ 
Debug.Log("Hey"); 
} 
0

命名空間System.Linq的你可以把你的變量在適當的列表中,然後測試每個List它是否只包含一個特定值的元素(truefalse ):

List<bool> thingsTestedForTrue = new List<bool> { boolThing[0], boolThing[1], boolThing[2] }; 
List<bool> thingsTestedForFalse = new List<bool> { boolThing[3], boolThing[4], boolThing[5] }; 

if(thingsTestedForTrue.All(thing => thing == true) && thingsTestedForFalse.All(thing => thing == false) 
{ 
    // All values passed 
}