2012-08-26 38 views
4

通常在我的代碼中,我需要檢查x的布爾量的狀態是否全部爲真或者所有的布爾是否爲假。所以,我做的:所有布爾的速記YES或所有布爾NO?

BOOL first, second, third; 
if((first && second && third) || (!first && !second && !third)) 
    //do something 

作爲一個懶惰的程序員,我想知道是否有這種類型的查詢一些數學簡寫,而不必每次都輸入了這件事?

+0

我敢肯定,這是使用標準布爾邏輯運算符來表達的唯一方法。你想用某種特定語言來做這件事嗎?一些語言有這樣的東西的速記方法 – murgatroid99

+0

如果所有的元素都在不同的集合中,則在謂詞邏輯中存在。 – RBarryYoung

+0

那麼,我使用的是Objective-C – Snowman

回答

5

簡寫爲所有的bool同樣是針對(配對)相等性測試:

(first==second && second==third) 

當然你也可以擴展爲任意數量的布爾值,有N-1平等檢查加入與運營商。

+2

但謹慎:'BOOL'不幸是'signed char'的typedef。 – justin

+1

@Justin你認爲檢查'(!first ==!second &&!second ==!third)'而不是? – Howard

+0

請參閱http://stackoverflow.com/questions/11134352/in-objective-c-safe-and-good-way-to-compare-2-bool-values –

2

檢查總和爲0或等於布爾變量的數量:

((first + second + third) % 3 == 0) 

這適用於任意數量的參數。

(但不要把這個答案認真,做真實的。)

+0

爲什麼不做真正的? – Snowman

+2

在BOOL上使用這個絕對是邪惡的。建議僅用於混淆您的代碼。 – Sulthan

+1

@mohabitar因爲它隱藏了你的代碼的含義。這就像問:「你想要冰激凌的剩餘部分和孩子的總數是否等於零?」而不是「每個人都想要冰淇淋?」。我的意思是一個笑話。顯然有些人仍然感到不快。 –

1

當談到謂詞,通常可以使用兩個變量的量化操作的簡化邏輯 - 通用量化(所有)和存在量化(存在)。如果您在數組中有很多布爾值的

BOOL allValues = (value1 && value2 && value3); 
BOOL anyValue = (value1 || value2 || value3); 

if (allValues || !anyValue) { 
    ... do something 
}

這也將工作 - 你可以創建一個for週期評估的兩個變量。

3

如果這是你經常需要的東西,那麼你最好使用一個整數並單獨讀取位。

例如,而不是:

BOOL x; // not this 
BOOL y; // not this 
BOOL z; // not this 

...和,而不是位字段(因爲它們的佈局是實現定義):

unsigned int x : 1; // not this 
unsigned int y : 1; // not this 
unsigned int z : 1; // not this 

... 使用單場如:

unsigned int flags; // do this 

...和爲將每個值標記爲;例如:

enum { // do this 
    FLAG_X = (1 << 0), 
    FLAG_Y = (1 << 1), 
    FLAG_Z = (1 << 2), 
    ALL_FLAGS = 0x07 // "all bits are on" 
}; 

然後,測試「都是假的」你只需說「if (!flags)」並測試「全真」,你只需說「if (flags == ALL_FLAGS)」,其中ALL_FLAGS是一個數字,將所有有效位爲1。其他按位運算符可用於根據需要設置或測試各個位。

請注意,在您必須執行更多操作(例如,創建一個額外的整數字段以存儲更多位)之前,此技術的上限爲32個布爾值。

+0

有趣的技術..我不是很熟悉你在做什麼與枚舉部分..所以一個int有... 32位?並通過做1 << x,你得到第x位?關於0x07呢? – Snowman

+0

一個整數通常至少爲32位,儘管這取決於體系結構。 (使用''和類型'uint32_t'是確定變量至少具有這種大小的一個好方法。)枚舉可以用各種方式定義;我的目標是選擇只有一位差異的值,所以1,2,4,...我發現使用移位運算符做到這一點最爲明顯。同樣,'0x07'只意味着'7'(二進制中的是'111';我的目標是將所有位設置爲1)。 –

+0

任何想法,我可以閱讀更多關於你在說什麼? – Snowman