web-dev-qa-db-ja.com

ブール値を反転する最も簡単な方法は?

ブール値を、既にあるものに基づいて反転させたいだけです。真の場合-偽にします。 falseの場合-trueにします。

コードの抜粋は次のとおりです。

switch(wParam) {

case VK_F11:
  if (flipVal == true) {
     flipVal = false;
  } else {
    flipVal = true;
  }
break;

case VK_F12:
  if (otherVal == true) {
     otherValVal = false;
  } else {
    otherVal = true;
  }
break;

default:
break;
}
108
John T

次のように値を反転できます:

myVal = !myVal;

したがって、コードは次のように短縮されます。

switch(wParam) {
    case VK_F11:
    flipVal = !flipVal;
    break;

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}
316
John T

明らかに工場パターンが必要です!

KeyFactory keyFactory = new KeyFactory();
KeyObj keyObj = keyFactory.getKeyObj(wParam);
keyObj.doStuff();


class VK_F11 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class VK_F12 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class KeyFactory {
   public KeyObj getKeyObj(int param) {
      switch(param) {
         case VK_F11:
            return new VK_F11();
         case VK_F12:
            return new VK_F12();
      }
      throw new KeyNotFoundException("Key " + param + " was not found!");
   }
}

:D

</sarcasm>
74
Drew

値が0または1であることがわかっている場合は、flipval ^= 1を実行できます。

33
Mike Dunlavey

私が見つけた最も簡単なソリューション:

x ^= true;
26
xamid

情報のみ-整数の代わりに、必要なフィールドが大きな型内の単一ビットである場合、代わりに 'xor'演算子を使用します。

int flags;

int flag_a = 0x01;
int flag_b = 0x02;
int flag_c = 0x04;

/* I want to flip 'flag_b' without touching 'flag_a' or 'flag_c' */
flags ^= flag_b;

/* I want to set 'flag_b' */
flags |= flag_b;

/* I want to clear (or 'reset') 'flag_b' */
flags &= ~flag_b;

/* I want to test 'flag_b' */
bool b_is_set = (flags & flag_b) != 0;
10
Alnitak

これはすべて無料のようです...へ。ここに別のバリエーションがありますが、これは私が製品コードに推奨するものよりも「賢い」カテゴリーに属していると思います:

flipVal ^= (wParam == VK_F11);
otherVal ^= (wParam == VK_F12);

私はそれの利点があると思います:

  • とても簡潔
  • 分岐する必要はありません

そして同様に明らかな欠点は

  • とても簡潔

これは?:を使用した@koronaのソリューションに近いですが、さらに1つ(小さな)ステップを踏みました。

9
unwind

ブールを切り替える私のお気に入りの奇妙なボールの方法がリストされていないという理由だけで...

bool x = true;
x = x == false;

も動作します。 :)

(はいx = !x;はより明確で読みやすいです)

8
Rozwel

Codegolf'ishソリューションは次のようになります。

flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
6
korona
flipVal ^= 1;

同じことが言えます

otherVal
2
evandrix

私はJohn Tのソリューションを好みますが、もしあなたがすべてのコードゴルフに行きたいなら、あなたの声明は論理的にこれに還元されます:

//if key is down, toggle the boolean, else leave it alone.
flipVal = ((wParam==VK_F11) && !flipVal) || (!(wParam==VK_F11) && flipVal);
if(wParam==VK_F11) Break;

//if key is down, toggle the boolean, else leave it alone.
otherVal = ((wParam==VK_F12) && !otherVal) || (!(wParam==VK_F12) && otherVal);
if(wParam==VK_F12) Break;
2
JosephStyons

明らかに、ブール値を装った型をサポートできる柔軟なソリューションが必要です。以下はそれを可能にします:

template<typename T>    bool Flip(const T& t);

次に、これをブール型のふりをする可能性のあるさまざまなタイプに特化できます。例えば:

template<>  bool Flip<bool>(const bool& b)  { return !b; }
template<>  bool Flip<int>(const int& i)    { return !(i == 0); }

この構成の使用例:

if(Flip(false))  { printf("flipped false\n"); }
if(!Flip(true))  { printf("flipped true\n"); }

if(Flip(0))  { printf("flipped 0\n"); }
if(!Flip(1)) { printf("flipped 1\n"); }

いいえ、私は本気ではありません。

0
dma