Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[C/C++]最小と最大

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;
}

…うーん、なにかもっといい方法がありそうな予感。

投稿日時 : 2009年1月24日 22:51

Feedback

# re: [C/C++]最小と最大 2009/01/25 0:11 n

>一つでもfalseならfalseを返す

なら
for(int i = 0; i < 100 && flag == true; i++){
flag = IsCheck(n);
}

の方がループ回数が減る・・・

# re: [C/C++]最小と最大 2009/01/25 2:36 アキラ

> logicalvalue(const T &t){ value = t;}

初期化子リストを使いましょう

# [C#]最小と最大 2009/01/25 6:54 Garbage Collection

[C#]最小と最大

# re: [C/C++]最小と最大 2009/01/25 8:08 出水

>nさん
IsCheckが書き換えを伴わない関数ならそうですね

>アキラさん
max_elementとxxxを組み合わせればいいんじゃないのん?って突っ込みかと思った

# re: [C/C++]最小と最大 2009/01/25 9:52 n

>max_elementとxxxを組み合わせればいいんじゃないのん?って突っ込みかと思った

std::sort して最初と最後でいいんじゃないの?

# http://burberry.suppa.jp/ 2012/11/06 21:05 バーバリー アウトレット

今日は~^^またブログ覗かせていただきました。よろしくお願いします。

タイトル
名前
Url
コメント