138

ブール値を、それがすでに何であるかに基づいて反転させたいだけです。それが本当なら-それを偽にしてください。それが偽の場合-それを真にします。

これが私のコードの抜粋です:

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

13 に答える 13

383

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

myVal = !myVal;

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

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

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}
于 2009-03-04T14:55:26.467 に答える
90

明らかにファクトリパターンが必要です!

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>
于 2009-03-04T16:56:11.667 に答える
47

私が見つけた最も簡単な解決策:

x ^= true;
于 2014-03-21T16:46:39.267 に答える
43

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

于 2009-03-04T16:55:44.337 に答える
15

参考までに、整数の代わりに必須フィールドがより大きな型内の1ビットである場合は、代わりに「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;
于 2009-03-04T16:58:35.827 に答える
10

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

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

も動作します。:)

(はい、x = !x;より明確で読みやすくなっています)

于 2012-03-07T20:34:36.893 に答える
10

これは誰でも自由に参加できるようです...へー。これは別のバリエーションです。これは、製品コードに推奨するものよりも「賢い」カテゴリにあると思います。

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

その利点は次のとおりだと思います。

  • 非常に簡潔
  • 分岐不要

そして明らかな欠点は

  • 非常に簡潔

これは ?: を使用した @korona のソリューションに近いですが、さらに 1 つ (小さな) 一歩進んでいます。

于 2009-03-05T07:56:17.450 に答える
8

コードゴルフのようなソリューションは、次のようになります。

flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
于 2009-03-04T16:00:15.903 に答える
2

私は 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;
于 2009-03-04T15:25:48.640 に答える
0

値が 0 と 1 の整数の場合は、次を試すことができます。

value = abs(value - 1);

C言語のMWE:

#include <stdio.h>
#include <stdlib.h>
int main()
{
        printf("Hello, World!\n");
        int value = 0;
        int i;
        for (i=0; i<10; i++)
        {
                value = abs(value -1);
                printf("%d\n", value);
        }
        return 0;
}
于 2020-01-02T21:10:55.157 に答える