Shorthand for all bools YES or all bools NO?

社会主义新天地 提交于 2020-01-03 16:55:17

问题


Often in my code I need to check whether the state of x amount of bools are all true OR all bools are false. So I do:

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

Being a lazy programmer, I want to know if there is some mathematical shorthand for this kind of query, instead of having to type out this whole thing every time?


回答1:


The shorthand for all bools the same is testing for (pairwise) equality:

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

Of course you can expand this to any number of booleans, having N-1 equality checks joined with the and operator.




回答2:


If this is something you frequently require then you're better off using an integer and reading bits individually.

For instance, instead of:

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

...and instead of bit fields (because their layout is implementation-defined):

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

...use a single field such as:

unsigned int flags; // do this

...and assign every value to a bit; for example:

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

Then, to test "all false" you simply say "if (!flags)" and to test "all true" you simply say "if (flags == ALL_FLAGS)" where ALL_FLAGS is a number that sets all valid bits to 1. Other bitwise operators can be used to set or test individual bits as needed.

Note that this technique has an upper limit of 32 Boolean values before you have to do more (e.g. create an additional integer field to store more bits).




回答3:


Check if the sum is 0 or equal to the number of bools:

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

This works for any number of arguments.

(But don't take this answer serious and do it for real.)




回答4:


When speaking about predicates, you can usually simplify the logic by using two variables for the quantification operations - universal quantification (for all) and existential quantification (there exists).

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

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

This would also work if you have a lot of boolean values in an array - you could create a for cycle evaluating the two variables.



来源:https://stackoverflow.com/questions/12131879/shorthand-for-all-bools-yes-or-all-bools-no

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!