100個のすべてがtrueならtrue、一つでもfalseならfalseを返す関数を作ります。
bool IsCheck(int n);
bool IsCheckAll(){
bool flag = true;
for(int i = 0; i < 100; i++){
flag &= IsCheck(n);
}
return flag;
}
ビット演算の部分が肝ですね。
SQLなどで出てくる三値論理というのもあります。
true/falseの他にunknown(またはNULL)というものが加わります。
false and unknownはどんな値か考えてみます。
unknownがtrueならこの式はfalseです。
unknownがfalseならこの式はfalseです。
どっちにしろ、falseなので、false and unknown = falseとなります。
このように、unknownの場所にはtrueとfalseの両方を試しに入れてみて、
どちらも同じ結果ならその値、trueとfalseに別れてしまったらunknownと考えます。
しかし、もうちょっと覚えやすい方法があります。
それは、false=0, unknown=1, true=2として数値化すれば、
andは小さい方を返す演算子(min)、orは大きい方を返す演算子(max)です。
ということで、最初のソースの書式で最小、最大を求めるクラスを作りました。
template <typename T>
class logicalvalue{
T value;
public:
const T &operator &=(const T &t){
if (t < value) value = t;
return value;
}
const T &operator |=(const T &t){
if (value < t) value = t;
return value;
}
logicalvalue(const T &t){ value = t;}
const T &GetValue(){return value;}
};
使い方はこんな感じですね。
int test(){
logicalvalue<int> min = 100, max = 1;
for (int i = 0; i < 10; i++){
min &= func(i);
max |= func(i);
}
printf("min %d, max %d\n", min.GetValue(), max.GetValue());
return 0;
}
…うーん、なにかもっといい方法がありそうな予感。